aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2019-11-19 07:29:26 +1030
committerAlan Modra <amodra@gmail.com>2019-11-19 07:35:05 +1030
commit94698d0198f4018b2ac248b248868cb7a5c0cc43 (patch)
treefe373cc4fe81bf04f1ab0171a8ec236444c79768
parentFix a bunch of python leaks due to missing calls to tp_free in *_dealloc func... (diff)
downloadbinutils-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/ChangeLog6
-rw-r--r--bfd/elf.c2
-rw-r--r--bfd/reloc.c27
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;
}