x86: Check valid PLT sections before checking dynamic relocations
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 29 Aug 2017 17:40:03 +0000 (10:40 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 29 Aug 2017 17:40:03 +0000 (10:40 -0700)
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.

bfd/ChangeLog
bfd/elf32-i386.c
bfd/elf64-x86-64.c

index 351fe834cba7ad2cff563eee078205d1dd20c679..21b01b7f398f7f6c3d40aa31969afac654e680b3 100644 (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>
 
        * elf-bfd.h (_bfd_elf_ifunc_get_synthetic_symtab): Removed.
index 05ba2c3b15b9ce61dd70c4c8ddb18f482706240d..31ef02a568e8292971d2c462b0f9602717cb24f2 100644 (file)
@@ -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.  */
index 25ce295c17811ac90e7c659211baf17c43839a33..ba7c5953c3ccda4165f6e5bb0e8b3b66d0b0a7eb 100644 (file)
@@ -6722,16 +6722,6 @@ elf_x86_64_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);
-
   if (get_elf_x86_64_backend_data (abfd)->os == is_normal)
     {
       lazy_plt = &elf_x86_64_lazy_plt;
@@ -6842,7 +6832,10 @@ elf_x86_64_get_synthetic_symtab (bfd *abfd,
        }
 
       if (plt_type == plt_unknown)
-       continue;
+       {
+         free (plt_contents);
+         continue;
+       }
 
       plts[j].sec = plt;
       plts[j].type = plt_type;
@@ -6879,6 +6872,16 @@ elf_x86_64_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.  */