bfd, sparc: issue an error when reading relocations with invalid symbol references.

The function `elf64_sparc_slurp_one_reloc_table' in elf64-sparc.c
currently checks that the symbol indexes read in the r_sym fields of
relocations are in range.  This is done for both dynamic and
non-dynamic symbols.  This avoids subsequent invalid memory accesses.
However, no error is issued to the user.

This patch makes BFD to issue an error when the read symbol index is
out of range, following the same behavior implemented in both the
generic ELF routines and other ELF backends (such as mips64).

Tested in x86_64-linux-gnu, sparc64-linux-gnu, and
--enable-targets=all.

2018-09-04  Jose E. Marchesi  <jose.marchesi@oracle.com>

            * elf64-sparc.c (elf64_sparc_slurp_one_reloc_table): Issue an
            error when an invalid symbol index is retrieved in ELF64_R_SYM of
            a relocation seen in an input file.
This commit is contained in:
Jose E. Marchesi 2018-09-04 19:02:38 +02:00
parent fcc9b044b7
commit 8410d65b77
2 changed files with 19 additions and 5 deletions

View file

@ -1,3 +1,9 @@
2018-09-04 Jose E. Marchesi <jose.marchesi@oracle.com>
* elf64-sparc.c (elf64_sparc_slurp_one_reloc_table): Issue an
error when an invalid symbol index is retrieved in ELF64_R_SYM of
a relocation seen in an input file.
2018-09-03 Jozef Lawrynowicz <jozef.l@mittosystems.com>
Alan Modra <amodra@gmail.com>

View file

@ -97,12 +97,20 @@ elf64_sparc_slurp_one_reloc_table (bfd *abfd, asection *asect,
else
relent->address = rela.r_offset - asect->vma;
if (ELF64_R_SYM (rela.r_info) == STN_UNDEF
/* PR 17512: file: 996185f8. */
|| (!dynamic && ELF64_R_SYM(rela.r_info) > bfd_get_symcount(abfd))
|| (dynamic
&& ELF64_R_SYM(rela.r_info) > bfd_get_dynamic_symcount(abfd)))
if (ELF64_R_SYM (rela.r_info) == STN_UNDEF)
relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
else if (/* PR 17512: file: 996185f8. */
(!dynamic && ELF64_R_SYM(rela.r_info) > bfd_get_symcount(abfd))
|| (dynamic
&& ELF64_R_SYM(rela.r_info) > bfd_get_dynamic_symcount(abfd)))
{
_bfd_error_handler
/* xgettext:c-format */
(_("%pB(%pA): relocation %d has invalid symbol index %ld"),
abfd, asect, i, (long) ELF64_R_SYM (rela.r_info));
bfd_set_error (bfd_error_bad_value);
relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
}
else
{
asymbol **ps, *s;