]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
PR23685, buffer overflow
authorAlan Modra <amodra@gmail.com>
Thu, 20 Sep 2018 08:53:17 +0000 (18:23 +0930)
committerAlan Modra <amodra@gmail.com>
Thu, 20 Sep 2018 10:50:03 +0000 (20:20 +0930)
PR 23685
* peXXigen.c (pe_print_edata): Correct export address table
overflow checks.  Check dataoff against section size too.

bfd/ChangeLog
bfd/peXXigen.c

index fef54798a330c4208334d02ad614aa6bd3bcb3d0..81b9e56072b7cbc828a2c0af3f01a8d28ff8a24d 100644 (file)
@@ -1,3 +1,9 @@
+2018-09-20  Alan Modra  <amodra@gmail.com>
+
+       PR 23685
+       * peXXigen.c (pe_print_edata): Correct export address table
+       overflow checks.  Check dataoff against section size too.
+
 2018-09-20  Alan Modra  <amodra@gmail.com>
 
        PR 23686
index 598f2ca3ac83ef0325ecebd0a674b17a0584b86d..1645ef4b77cb682e2593c633b4feaad61306a04a 100644 (file)
@@ -1661,7 +1661,8 @@ pe_print_edata (bfd * abfd, void * vfile)
 
       dataoff = addr - section->vma;
       datasize = extra->DataDirectory[PE_EXPORT_TABLE].Size;
-      if (datasize > section->size - dataoff)
+      if (dataoff > section->size
+         || datasize > section->size - dataoff)
        {
          fprintf (file,
                   _("\nThere is an export table in %s, but it does not fit into that section\n"),
@@ -1778,11 +1779,11 @@ pe_print_edata (bfd * abfd, void * vfile)
          edt.base);
 
   /* PR 17512: Handle corrupt PE binaries.  */
-  if (edt.eat_addr + (edt.num_functions * 4) - adj >= datasize
+  /* PR 17512 file: 140-165018-0.004.  */
+  if (edt.eat_addr - adj >= datasize
       /* PR 17512: file: 092b1829 */
-      || (edt.num_functions * 4) < edt.num_functions
-      /* PR 17512 file: 140-165018-0.004.  */
-      || data + edt.eat_addr - adj < data)
+      || (edt.num_functions + 1) * 4 < edt.num_functions
+      || edt.eat_addr - adj + (edt.num_functions + 1) * 4 > datasize)
     fprintf (file, _("\tInvalid Export Address Table rva (0x%lx) or entry count (0x%lx)\n"),
             (long) edt.eat_addr,
             (long) edt.num_functions);