mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-15 04:31:49 +08:00
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:
parent
7ef3addbe1
commit
37c0b6ee65
@ -1,3 +1,10 @@
|
|||||||
|
2017-08-29 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
|
* 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.
|
||||||
|
|
||||||
2017-08-28 H.J. Lu <hongjiu.lu@intel.com>
|
2017-08-28 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* elf-bfd.h (_bfd_elf_ifunc_get_synthetic_symtab): Removed.
|
* elf-bfd.h (_bfd_elf_ifunc_get_synthetic_symtab): Removed.
|
||||||
|
@ -6326,16 +6326,6 @@ elf_i386_get_synthetic_symtab (bfd *abfd,
|
|||||||
if (relsize <= 0)
|
if (relsize <= 0)
|
||||||
return -1;
|
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;
|
non_lazy_plt = NULL;
|
||||||
/* Silence GCC 6. */
|
/* Silence GCC 6. */
|
||||||
lazy_plt = NULL;
|
lazy_plt = NULL;
|
||||||
@ -6447,7 +6437,10 @@ elf_i386_get_synthetic_symtab (bfd *abfd,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (plt_type == plt_unknown)
|
if (plt_type == plt_unknown)
|
||||||
continue;
|
{
|
||||||
|
free (plt_contents);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
plts[j].sec = plt;
|
plts[j].sec = plt;
|
||||||
plts[j].type = plt_type;
|
plts[j].type = plt_type;
|
||||||
@ -6487,6 +6480,16 @@ elf_i386_get_synthetic_symtab (bfd *abfd,
|
|||||||
if (count == 0)
|
if (count == 0)
|
||||||
return -1;
|
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);
|
size = count * sizeof (asymbol);
|
||||||
|
|
||||||
/* Allocate space for @plt suffixes. */
|
/* Allocate space for @plt suffixes. */
|
||||||
|
@ -6722,16 +6722,6 @@ elf_x86_64_get_synthetic_symtab (bfd *abfd,
|
|||||||
if (relsize <= 0)
|
if (relsize <= 0)
|
||||||
return -1;
|
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);
|
|
||||||
|
|
||||||
if (get_elf_x86_64_backend_data (abfd)->os == is_normal)
|
if (get_elf_x86_64_backend_data (abfd)->os == is_normal)
|
||||||
{
|
{
|
||||||
lazy_plt = &elf_x86_64_lazy_plt;
|
lazy_plt = &elf_x86_64_lazy_plt;
|
||||||
@ -6842,7 +6832,10 @@ elf_x86_64_get_synthetic_symtab (bfd *abfd,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (plt_type == plt_unknown)
|
if (plt_type == plt_unknown)
|
||||||
continue;
|
{
|
||||||
|
free (plt_contents);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
plts[j].sec = plt;
|
plts[j].sec = plt;
|
||||||
plts[j].type = plt_type;
|
plts[j].type = plt_type;
|
||||||
@ -6879,6 +6872,16 @@ elf_x86_64_get_synthetic_symtab (bfd *abfd,
|
|||||||
if (count == 0)
|
if (count == 0)
|
||||||
return -1;
|
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);
|
size = count * sizeof (asymbol);
|
||||||
|
|
||||||
/* Allocate space for @plt suffixes. */
|
/* Allocate space for @plt suffixes. */
|
||||||
|
Loading…
Reference in New Issue
Block a user