forked from Imagelibrary/binutils-gdb
x86: Check valid PLT sections before checking dynamic relocations
Update x86 get_synthetic_symtab to check valid PLT sections before checking dynamic relocations and free invalid PLT section contents. * elf32-i386.c (elf_i386_get_synthetic_symtab): Check valid PLT sections before checking dynamic relocations and free invalid PLT section contents. * elf64-x86-64.c (elf_x86_64_get_synthetic_symtab): Likewise.
This commit is contained in:
@@ -6326,16 +6326,6 @@ elf_i386_get_synthetic_symtab (bfd *abfd,
|
||||
if (relsize <= 0)
|
||||
return -1;
|
||||
|
||||
dynrelbuf = (arelent **) bfd_malloc (relsize);
|
||||
if (dynrelbuf == NULL)
|
||||
return -1;
|
||||
|
||||
dynrelcount = bfd_canonicalize_dynamic_reloc (abfd, dynrelbuf,
|
||||
dynsyms);
|
||||
|
||||
/* Sort the relocs by address. */
|
||||
qsort (dynrelbuf, dynrelcount, sizeof (arelent *), compare_relocs);
|
||||
|
||||
non_lazy_plt = NULL;
|
||||
/* Silence GCC 6. */
|
||||
lazy_plt = NULL;
|
||||
@@ -6447,7 +6437,10 @@ elf_i386_get_synthetic_symtab (bfd *abfd,
|
||||
}
|
||||
|
||||
if (plt_type == plt_unknown)
|
||||
continue;
|
||||
{
|
||||
free (plt_contents);
|
||||
continue;
|
||||
}
|
||||
|
||||
plts[j].sec = plt;
|
||||
plts[j].type = plt_type;
|
||||
@@ -6487,6 +6480,16 @@ elf_i386_get_synthetic_symtab (bfd *abfd,
|
||||
if (count == 0)
|
||||
return -1;
|
||||
|
||||
dynrelbuf = (arelent **) bfd_malloc (relsize);
|
||||
if (dynrelbuf == NULL)
|
||||
return -1;
|
||||
|
||||
dynrelcount = bfd_canonicalize_dynamic_reloc (abfd, dynrelbuf,
|
||||
dynsyms);
|
||||
|
||||
/* Sort the relocs by address. */
|
||||
qsort (dynrelbuf, dynrelcount, sizeof (arelent *), compare_relocs);
|
||||
|
||||
size = count * sizeof (asymbol);
|
||||
|
||||
/* Allocate space for @plt suffixes. */
|
||||
|
||||
Reference in New Issue
Block a user