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.
This commit is contained in:
parent
2e953acac2
commit
94698d0198
@ -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>):
|
||||
|
@ -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;
|
||||
|
27
bfd/reloc.c
27
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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user