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:
H.J. Lu 2017-08-29 10:40:03 -07:00
parent 7ef3addbe1
commit 37c0b6ee65
3 changed files with 35 additions and 22 deletions

View File

@ -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.

View File

@ -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. */

View File

@ -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. */