mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-22 11:00:01 +08:00
PR28175, Segment fault in coff-tic30.c reloc_processing
The obj_convert table shouldn't be accessed without first checking the index against the table size. PR 28175 * coff-tic30.c (reloc_processing): Sanity check reloc symbol index. * coff-z80.c (reloc_processing): Likewise. * coff-z8k.c (reloc_processing): Likewise.
This commit is contained in:
@ -161,11 +161,18 @@ reloc_processing (arelent *relent,
|
|||||||
relent->address = reloc->r_vaddr;
|
relent->address = reloc->r_vaddr;
|
||||||
rtype2howto (relent, reloc);
|
rtype2howto (relent, reloc);
|
||||||
|
|
||||||
if (reloc->r_symndx > 0)
|
if (reloc->r_symndx == -1)
|
||||||
|
relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
|
||||||
|
else if (reloc->r_symndx >= 0 && reloc->r_symndx < obj_conv_table_size (abfd))
|
||||||
relent->sym_ptr_ptr = symbols + obj_convert (abfd)[reloc->r_symndx];
|
relent->sym_ptr_ptr = symbols + obj_convert (abfd)[reloc->r_symndx];
|
||||||
else
|
else
|
||||||
relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
|
{
|
||||||
|
_bfd_error_handler
|
||||||
|
/* xgettext:c-format */
|
||||||
|
(_("%pB: warning: illegal symbol index %ld in relocs"),
|
||||||
|
abfd, reloc->r_symndx);
|
||||||
|
relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
|
||||||
|
}
|
||||||
relent->addend = reloc->r_offset;
|
relent->addend = reloc->r_offset;
|
||||||
relent->address -= section->vma;
|
relent->address -= section->vma;
|
||||||
}
|
}
|
||||||
|
@ -314,11 +314,18 @@ reloc_processing (arelent *relent,
|
|||||||
relent->address = reloc->r_vaddr;
|
relent->address = reloc->r_vaddr;
|
||||||
rtype2howto (relent, reloc);
|
rtype2howto (relent, reloc);
|
||||||
|
|
||||||
if (reloc->r_symndx > 0)
|
if (reloc->r_symndx == -1)
|
||||||
|
relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
|
||||||
|
else if (reloc->r_symndx >= 0 && reloc->r_symndx < obj_conv_table_size (abfd))
|
||||||
relent->sym_ptr_ptr = symbols + obj_convert (abfd)[reloc->r_symndx];
|
relent->sym_ptr_ptr = symbols + obj_convert (abfd)[reloc->r_symndx];
|
||||||
else
|
else
|
||||||
relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
|
{
|
||||||
|
_bfd_error_handler
|
||||||
|
/* xgettext:c-format */
|
||||||
|
(_("%pB: warning: illegal symbol index %ld in relocs"),
|
||||||
|
abfd, reloc->r_symndx);
|
||||||
|
relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
|
||||||
|
}
|
||||||
relent->addend = reloc->r_offset;
|
relent->addend = reloc->r_offset;
|
||||||
relent->address -= section->vma;
|
relent->address -= section->vma;
|
||||||
}
|
}
|
||||||
|
@ -177,11 +177,18 @@ reloc_processing (arelent *relent,
|
|||||||
relent->address = reloc->r_vaddr;
|
relent->address = reloc->r_vaddr;
|
||||||
rtype2howto (relent, reloc);
|
rtype2howto (relent, reloc);
|
||||||
|
|
||||||
if (reloc->r_symndx > 0)
|
if (reloc->r_symndx == -1)
|
||||||
|
relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
|
||||||
|
else if (reloc->r_symndx >= 0 && reloc->r_symndx < obj_conv_table_size (abfd))
|
||||||
relent->sym_ptr_ptr = symbols + obj_convert (abfd)[reloc->r_symndx];
|
relent->sym_ptr_ptr = symbols + obj_convert (abfd)[reloc->r_symndx];
|
||||||
else
|
else
|
||||||
relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
|
{
|
||||||
|
_bfd_error_handler
|
||||||
|
/* xgettext:c-format */
|
||||||
|
(_("%pB: warning: illegal symbol index %ld in relocs"),
|
||||||
|
abfd, reloc->r_symndx);
|
||||||
|
relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
|
||||||
|
}
|
||||||
relent->addend = reloc->r_offset;
|
relent->addend = reloc->r_offset;
|
||||||
relent->address -= section->vma;
|
relent->address -= section->vma;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user