* peXXigen.c (pe_print_edata): Verify edt.name lies inside
authorJon Turney <jon.turney@dronecode.org.uk>
Thu, 3 Apr 2014 11:26:27 +0000 (12:26 +0100)
committerNick Clifton <nickc@redhat.com>
Thu, 3 Apr 2014 11:26:27 +0000 (12:26 +0100)
section before dereferencing.
(pe_print_idata, pe_print_edata, pe_print_reloc)
(rsrc_print_section): Don't bother interpreting the contents
of sections which have no contents.

bfd/ChangeLog
bfd/peXXigen.c

index 86ac6d7d534bee598724a07123be03366160e7e3..c1c6b3ef8227f931a9b52efaf55137c49fc2b028 100644 (file)
@@ -1,3 +1,11 @@
+2014-04-03  Jon Turney  <jon.turney@dronecode.org.uk>
+
+       * peXXigen.c (pe_print_edata): Verify edt.name lies inside
+       section before dereferencing.
+       (pe_print_idata, pe_print_edata, pe_print_reloc)
+       (rsrc_print_section): Don't bother interpreting the contents
+       of sections which have no contents.
+
 2014-04-03  Maria Guseva  <m.guseva@samsung.com>
 
        PR ld/16803
index 6d95827a047168e0cace3de8305a778b6a3990d1..e78edaacd1514351f14205af77df1a28aa97b83b 100644 (file)
@@ -1111,6 +1111,13 @@ pe_print_idata (bfd * abfd, void * vfile)
                   _("\nThere is an import table, but the section containing it could not be found\n"));
          return TRUE;
        }
+      else if (!(section->flags & SEC_HAS_CONTENTS))
+        {
+         fprintf (file,
+                  _("\nThere is an import table in %s, but that section has no contents\n"),
+                  section->name);
+         return TRUE;
+        }
     }
 
   fprintf (file, _("\nThere is an import table in %s at 0x%lx\n"),
@@ -1373,7 +1380,7 @@ pe_print_edata (bfd * abfd, void * vfile)
   bfd_size_type datasize = 0;
   bfd_size_type dataoff;
   bfd_size_type i;
-  bfd_signed_vma adj;
+  bfd_vma       adj;
   struct EDT_type
   {
     long export_flags;          /* Reserved - should be zero.  */
@@ -1423,6 +1430,13 @@ pe_print_edata (bfd * abfd, void * vfile)
                   _("\nThere is an export table, but the section containing it could not be found\n"));
          return TRUE;
        }
+      else if (!(section->flags & SEC_HAS_CONTENTS))
+        {
+         fprintf (file,
+                  _("\nThere is an export table in %s, but that section has no contents\n"),
+                  section->name);
+         return TRUE;
+        }
 
       dataoff = addr - section->vma;
       datasize = extra->DataDirectory[PE_EXPORT_TABLE].Size;
@@ -1478,8 +1492,11 @@ pe_print_edata (bfd * abfd, void * vfile)
   fprintf (file,
           _("Name \t\t\t\t"));
   bfd_fprintf_vma (abfd, file, edt.name);
-  fprintf (file,
-          " %s\n", data + edt.name - adj);
+
+  if ((edt.name >= adj) && (edt.name < adj + datasize))
+    fprintf (file, " %s\n", data + edt.name - adj);
+  else
+    fprintf (file, "(outside .edata section)\n");
 
   fprintf (file,
           _("Ordinal Base \t\t\t%ld\n"), edt.base);
@@ -1927,10 +1944,7 @@ pe_print_reloc (bfd * abfd, void * vfile)
   bfd_size_type i;
   bfd_size_type start, stop;
 
-  if (section == NULL)
-    return TRUE;
-
-  if (section->size == 0)
+  if (section == NULL || section->size == 0 || !(section->flags & SEC_HAS_CONTENTS))
     return TRUE;
 
   fprintf (file,
@@ -2166,7 +2180,6 @@ rsrc_print_section (bfd * abfd, void * vfile)
   bfd_byte * dataend;
   bfd_byte * datastart;
 
-
   pe = pe_data (abfd);
   if (pe == NULL)
     return TRUE;
@@ -2174,13 +2187,15 @@ rsrc_print_section (bfd * abfd, void * vfile)
   section = bfd_get_section_by_name (abfd, ".rsrc");
   if (section == NULL)
     return TRUE;
-
-  rva_bias = section->vma - pe->pe_opthdr.ImageBase;
+  if (!(section->flags & SEC_HAS_CONTENTS))
+    return TRUE;
 
   datasize = section->size;
   if (datasize == 0)
     return TRUE;
 
+  rva_bias = section->vma - pe->pe_opthdr.ImageBase;
+
   if (! bfd_malloc_and_get_section (abfd, section, & data))
     {
       if (data != NULL)
This page took 0.027786 seconds and 4 git commands to generate.