PR25200, SIGSEGV in _bfd_elf_validate_reloc

Message ID 20191118212753.GE13199@bubble.grove.modra.org
State New
Headers show
Series
  • PR25200, SIGSEGV in _bfd_elf_validate_reloc
Related show

Commit Message

Alan Modra Nov. 18, 2019, 9:27 p.m.
Committed.

	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.


-- 
Alan Modra
Australia Development Lab, IBM

Patch

diff --git a/bfd/elf.c b/bfd/elf.c
index 88e51c4f7d..a221bf0d04 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 ae71f6b005..cc842d7514 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;
 }