From 94698d0198f4018b2ac248b248868cb7a5c0cc43 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 19 Nov 2019 07:29:26 +1030 Subject: 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. --- bfd/ChangeLog | 6 ++++++ bfd/elf.c | 2 +- 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 + + 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 * elf-bfd.h (struct elf_backend_data ): 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; } -- cgit v1.2.3-65-gdbad