diff options
author | Alan Modra <amodra@gmail.com> | 2019-11-19 07:29:26 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2019-11-19 07:35:05 +1030 |
commit | 94698d0198f4018b2ac248b248868cb7a5c0cc43 (patch) | |
tree | fe373cc4fe81bf04f1ab0171a8ec236444c79768 | |
parent | Fix a bunch of python leaks due to missing calls to tp_free in *_dealloc func... (diff) | |
download | binutils-gdb-94698d0198f4018b2ac248b248868cb7a5c0cc43.tar.gz binutils-gdb-94698d0198f4018b2ac248b248868cb7a5c0cc43.tar.bz2 binutils-gdb-94698d0198f4018b2ac248b248868cb7a5c0cc43.zip |
PR25200, SIGSEGV in _bfd_elf_validate_reloc
PR 25200
* reloc.c (bfd_default_reloc_type_lookup): Don't BFD_FAIL.
* elf.c (_bfd_elf_validate_reloc): Don't segfault on NULL howto.
-rw-r--r-- | bfd/ChangeLog | 6 | ||||
-rw-r--r-- | bfd/elf.c | 2 | ||||
-rw-r--r-- | bfd/reloc.c | 27 |
3 files changed, 12 insertions, 23 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 1a9e64f3f35..d13d9695ff0 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2019-11-19 Alan Modra <amodra@gmail.com> + + PR 25200 + * reloc.c (bfd_default_reloc_type_lookup): Don't BFD_FAIL. + * elf.c (_bfd_elf_validate_reloc): Don't segfault on NULL howto. + 2019-11-18 Alan Modra <amodra@gmail.com> * elf-bfd.h (struct elf_backend_data <elf_backend_init_file_header>): diff --git a/bfd/elf.c b/bfd/elf.c index 88e51c4f7d3..a221bf0d04b 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -9222,7 +9222,7 @@ _bfd_elf_validate_reloc (bfd *abfd, arelent *areloc) howto = bfd_reloc_type_lookup (abfd, code); - if (areloc->howto->pcrel_offset != howto->pcrel_offset) + if (howto && areloc->howto->pcrel_offset != howto->pcrel_offset) { if (howto->pcrel_offset) areloc->addend += areloc->address; diff --git a/bfd/reloc.c b/bfd/reloc.c index ae71f6b0054..cc842d7514f 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -8123,28 +8123,11 @@ DESCRIPTION reloc_howto_type * bfd_default_reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code) { - switch (code) - { - case BFD_RELOC_CTOR: - /* The type of reloc used in a ctor, which will be as wide as the - address - so either a 64, 32, or 16 bitter. */ - switch (bfd_arch_bits_per_address (abfd)) - { - case 64: - BFD_FAIL (); - break; - case 32: - return &bfd_howto_32; - case 16: - BFD_FAIL (); - break; - default: - BFD_FAIL (); - } - break; - default: - BFD_FAIL (); - } + /* Very limited support is provided for relocs in generic targets + such as elf32-little. FIXME: Should we always return NULL? */ + if (code == BFD_RELOC_CTOR + && bfd_arch_bits_per_address (abfd) == 32) + return &bfd_howto_32; return NULL; } |