winedump: Add a sanity check before dumping long format library export

Dmitry Timoshkov dmitry at codeweavers.com
Mon Feb 5 00:19:44 CST 2007


Hello,

some libraries generated by VC6 have very short archive members that lead
to a crash when winedump does an attempt to interpret them as a long format
export.

Changelog:
    winedump: Add a sanity check before dumping long format library export.

---
 tools/winedump/lib.c |   12 ++++++++----
 1 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/tools/winedump/lib.c b/tools/winedump/lib.c
index a7f8367..155a6fa 100644
--- a/tools/winedump/lib.c
+++ b/tools/winedump/lib.c
@@ -183,6 +183,9 @@ void lib_dump(void)
 
         cur_file_pos += sizeof(IMAGE_ARCHIVE_MEMBER_HEADER);
 
+        size = strtoul((const char *)iamh->Size, NULL, 10);
+        size = (size + 1) & ~1; /* align to an even address */
+
         /* FIXME: only import library contents with the short format are
          * recognized.
          */
@@ -193,6 +196,7 @@ void lib_dump(void)
         }
         else if (strncmp((const char *)iamh->Name, IMAGE_ARCHIVE_LINKER_MEMBER, sizeof(iamh->Name)))
         {
+            long expected_size;
             const IMAGE_FILE_HEADER *fh = (const IMAGE_FILE_HEADER *)ioh;
 
             if (globals.do_dumpheader)
@@ -204,12 +208,12 @@ void lib_dump(void)
                     dump_optional_header(oh, fh->SizeOfOptionalHeader);
                 }
             }
-            dump_long_import(fh, (const IMAGE_SECTION_HEADER *)((const char *)fh + sizeof(*fh) + fh->SizeOfOptionalHeader), fh->NumberOfSections);
+            /* Sanity check */
+            expected_size = sizeof(*fh) + fh->SizeOfOptionalHeader + fh->NumberOfSections * sizeof(IMAGE_SECTION_HEADER);
+            if (size > expected_size)
+                dump_long_import(fh, (const IMAGE_SECTION_HEADER *)((const char *)fh + sizeof(*fh) + fh->SizeOfOptionalHeader), fh->NumberOfSections);
         }
 
-        size = strtoul((const char *)iamh->Size, NULL, 10);
-        size = (size + 1) & ~1; /* align to an even address */
-
         cur_file_pos += size;
     }
 }
-- 
1.4.4.4






More information about the wine-patches mailing list