[2/2] version/tests: Unreliably test section zero padding up to virtual size

Ričardas Barkauskas miegalius at gmail.com
Wed Nov 10 17:08:53 CST 2010


It is unreliable because it crashes if data is not zeroed and thus depends
on somewhat random uninitialized data.
This test is tweaked to crash without fix on my system with current git (and
does it always).
If values in NumberOfIdEntries and NumberOfNamedEntries end up small it
doesn't crash.
Exe creation taken from dlls/fusion/tests/asmcache.c and tweaked to get
similar crash as ToEE.

If anyone knows how to make this test reliable please tell.

Ričardas Barkauskas
REalm
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-patches/attachments/20101111/2246adfa/attachment-0001.htm>
-------------- next part --------------
From 91ab62e97e2ab2640207a371dc72ca7a167859b0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ri=C4=8Dardas=20Barkauskas?= <miegalius at gmail.com>
Date: Thu, 11 Nov 2010 00:29:51 +0200
Subject: version/tests: Unreliably test section zero padding up to virtual size

---
 dlls/version/tests/info.c |  370 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 370 insertions(+), 0 deletions(-)

diff --git a/dlls/version/tests/info.c b/dlls/version/tests/info.c
index edf607c..d2a2272 100644
--- a/dlls/version/tests/info.c
+++ b/dlls/version/tests/info.c
@@ -58,6 +58,355 @@ static void create_file(const CHAR *name)
     CloseHandle(file);
 }
 
+typedef struct
+{
+    WORD wLength;
+    WORD wValueLength;
+    WORD wType;
+    WCHAR szKey[17];
+    VS_FIXEDFILEINFO Value;
+} VS_VERSIONINFO;
+
+typedef struct
+{
+    WORD wLength;
+    WORD wValueLength;
+    WORD wType;
+    WCHAR szKey[13];
+} VARFILEINFO;
+
+typedef struct
+{
+    WORD wLength;
+    WORD wValueLength;
+    WORD wType;
+    WCHAR szKey[13];
+    DWORD Value;
+} VAR;
+
+typedef struct
+{
+    WORD wLength;
+    WORD wValueLength;
+    WORD wType;
+    WCHAR szKey[15];
+} STRINGFILEINFO;
+
+typedef struct
+{
+    WORD wLength;
+    WORD wValueLength;
+    WORD wType;
+    WCHAR szKey[9];
+} STRINGTABLE;
+
+typedef struct
+{
+    WORD wLength;
+    WORD wValueLength;
+    WORD wType;
+} STRINGHDR;
+
+static struct _executable
+{
+    IMAGE_DOS_HEADER doshdr;
+    WORD unknown[32];
+    IMAGE_NT_HEADERS32 nthdrs;
+    IMAGE_SECTION_HEADER rsrc;
+    BYTE pad1[0x5860];
+    IMAGE_RESOURCE_DIRECTORY topresdir;
+    IMAGE_RESOURCE_DIRECTORY_ENTRY labelres;
+    IMAGE_RESOURCE_DIRECTORY res11dir;
+    IMAGE_RESOURCE_DIRECTORY_ENTRY label11res;
+    IMAGE_RESOURCE_DIRECTORY res10dir;
+    IMAGE_RESOURCE_DIRECTORY_ENTRY label10res;
+    IMAGE_RESOURCE_DATA_ENTRY resdata;
+    VS_VERSIONINFO verinfo;
+    VARFILEINFO varfileinfo;
+    VAR translation;
+    STRINGFILEINFO strfileinfo;
+    STRINGTABLE strtable;
+    STRINGHDR filedeschdr;
+    WCHAR filedesckey[17];
+    WCHAR filedescval[2];
+    STRINGHDR fileverhdr;
+    WCHAR fileverkey[13];
+    WCHAR fileverval[8];
+    STRINGHDR intnamehdr;
+    WCHAR intnamekey[13];
+    WCHAR intnameval[10];
+    STRINGHDR copyrighthdr;
+    WCHAR copyrightkey[15];
+    WCHAR copyrightval[2];
+    STRINGHDR orignamehdr;
+    WCHAR orignamekey[17];
+    WCHAR orignameval[10];
+    STRINGHDR prodverhdr;
+    WCHAR prodverkey[15];
+    WCHAR prodverval[8];
+    STRINGHDR asmverhdr;
+    WCHAR asmverkey[17];
+    WCHAR asmverval[8];
+} executable =
+{
+        /* IMAGE_DOS_HEADER */
+        {
+                IMAGE_DOS_SIGNATURE, 144, 3, 0, 4, 0, 0xFFFF, 0, 0xB8, 0, 0, 0, 0x40,
+                0, { 0  }, 0, 0, { 0 }, 0x80
+        },
+        /* binary to print "This program cannot be run in DOS mode." */
+        {
+                0x1F0E, 0x0EBA, 0xB400, 0xCD09, 0xB821, 0x4C01, 0x21CD, 0x6854, 0x7369,
+                0x7020, 0x6F72, 0x7267, 0x6D61, 0x6320, 0x6E61, 0x6F6E, 0x2074, 0x6562,
+                0x7220, 0x6E75, 0x6920, 0x206E, 0x4F44, 0x2053, 0x6F6D, 0x6564, 0x0D2E,
+                0x0A0D, 0x0024, 0x0000, 0x0000, 0x0000
+        },
+        /* IMAGE_NT_HEADERS32 */
+        {
+                IMAGE_NT_SIGNATURE, /* Signature */
+                /* IMAGE_FILE_HEADER */
+                {
+                        IMAGE_FILE_MACHINE_I386, /* Machine */
+                        4, /* NumberOfSections */
+                        0x47EFDF09, /* TimeDateStamp */
+                        0, /* PointerToSymbolTable */
+                        0, /* NumberOfSymbols */
+                        0xE0, /* SizeOfOptionalHeader */
+                        IMAGE_FILE_32BIT_MACHINE | IMAGE_FILE_LOCAL_SYMS_STRIPPED |
+                        IMAGE_FILE_LINE_NUMS_STRIPPED | IMAGE_FILE_EXECUTABLE_IMAGE |
+                        IMAGE_FILE_DLL, /* Characteristics */
+                },
+                /* IMAGE_OPTIONAL_HEADER32 */
+                {
+                        IMAGE_NT_OPTIONAL_HDR32_MAGIC, /* Magic */
+                        8, /* MajorLinkerVersion */
+                        0, /* MinorLinkerVersion */
+                        0x400, /* SizeOfCode */
+                        0x600, /* SizeOfInitializedData */
+                        0, /* SizeOfUninitializedData */
+                        0x238E, /* AddressOfEntryPoint */
+                        0x2000, /* BaseOfCode */
+                        0x4000, /* BaseOfData */
+                        0x400000, /* ImageBase */
+                        0x2000, /* SectionAlignment */
+                        0x200, /* FileAlignment */
+                        4, /* MajorOperatingSystemVersion */
+                        0, /* MinorOperatingSystemVersion */
+                        0, /* MajorImageVersion */
+                        0, /* MinorImageVersion */
+                        4, /* MajorSubsystemVersion */
+                        0, /* MinorSubsystemVersion */
+                        0, /* Win32VersionValue */
+                        0x8000, /* SizeOfImage */
+                        0x200, /* SizeOfHeaders */
+                        0xB576, /* CheckSum */
+                        IMAGE_SUBSYSTEM_WINDOWS_CUI, /* Subsystem */
+                        IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE |
+                        IMAGE_DLLCHARACTERISTICS_NO_SEH |
+                        IMAGE_DLLCHARACTERISTICS_NX_COMPAT, /* DllCharacteristics */
+                        0x100000, /* SizeOfStackReserve */
+                        0x1000, /* SizeOfStackCommit */
+                        0x100000, /* SizeOfHeapReserve */
+                        0x1000, /* SizeOfHeapCommit */
+                        0, /* LoaderFlags */
+                        0x10, /* NumberOfRvaAndSizes */
+                        /* IMAGE_DATA_DIRECTORY */
+                        {
+                                { 0 }, /* Export Table */
+                                { 0 }, /* Import Table */
+                                { 0x4000, 0x298 }, /* Resource Table */
+                                { 0 }, /* Exception Table */
+                                { 0 }, /* Certificate Table */
+                                { 0 }, /* Base Relocation Table */
+                                { 0 }, /* Debug */
+                                { 0 }, /* Copyright */
+                                { 0 }, /* Global Ptr */
+                                { 0 }, /* TLS Table */
+                                { 0 }, /* Load Config Table */
+                                { 0 }, /* Bound Import */
+                                { 0 }, /* IAT */
+                                { 0 }, /* Delay Import Descriptor */
+                                { 0 }, /* CLI Header */
+                                { 0 } /* Reserved */
+                        }
+                }
+        },
+        /* IMAGE_SECTION_HEADER */
+        {
+                ".rsrc", /* Name */
+                { 0x298 }, /* Misc.VirtualSize */
+                0x4000, /* VirtualAddress */
+                0x400, /* SizeOfRawData */
+                FIELD_OFFSET(struct _executable, topresdir), /* PointerToRawData */
+                0, /* PointerToRelocations */
+                0, /* PointerToLinenumbers */
+                0, /* NumberOfRelocations */
+                0, /* NumberOfLinenumbers */
+                IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ, /* Characteristics */
+        },
+        /* pad */
+        { 0 },
+        /* IMAGE_RESOURCE_DIRECTORY */
+        {
+                0, /* Characteristics */
+                0, /* TimeDateStamp */
+                0, /* MajorVersion */
+                0, /* MinorVersion */
+                0, /* NumberOfNamedEntries */
+                1, /* NumberOfIdEntries */
+        },
+        /* IMAGE_RESOURCE_DIRECTORY_ENTRY */
+        { { { 0 } }, { 0 } }, /* nameless unions initialized later */
+        /* IMAGE_RESOURCE_DIRECTORY */
+        {
+            0, /* Characteristics */
+            0, /* TimeDateStamp */
+            0, /* MajorVersion */
+            0, /* MinorVersion */
+            0, /* NumberOfNamedEntries */
+            1, /* NumberOfIdEntries */
+        },
+        /* IMAGE_RESOURCE_DIRECTORY_ENTRY */
+        { { { 0 } }, { 0 } }, /* nameless unions initialized later */
+        /* IMAGE_RESOURCE_DIRECTORY */
+        {
+            0, /* Characteristics */
+            0, /* TimeDateStamp */
+            0, /* MajorVersion */
+            0, /* MinorVersion */
+            0, /* NumberOfNamedEntries */
+            1, /* NumberOfIdEntries */
+        },
+        /* IMAGE_RESOURCE_DIRECTORY_ENTRY */
+        { { { 0 } }, { 0 } }, /* nameless unions initialized later */
+        /* IMAGE_RESOURCE_DATA_ENTRY */
+        {
+            0x4058, /* OffsetToData */
+            0x23C, /* Size */
+            0, /* CodePage */
+            0, /* Reserved */
+        },
+        /* VS_VERSIONINFO */
+        {
+            0x23C, /* wLength */
+            0x34, /* wValueLength */
+            0, /* wType */
+            { 'V','S','_','V','E','R','S','I','O','N','_','I','N','F','O',0,0 }, /* szKey */
+            /* VS_FIXEDFILEINFO */
+            {
+                VS_FFI_SIGNATURE, /* dwSignature */
+                VS_FFI_STRUCVERSION, /* dwStrucVersion */
+                0x10000, /* dwFileVersionMS */
+                0x00000, /* dwFileVersionLS */
+                0x10000, /* dwProductVersionMS */
+                0x00000, /* dwProductVersionLS */
+                VS_FFI_FILEFLAGSMASK, /* dwFileFlagsMask */
+                0x0, /* dwFileFlags */
+                VOS__WINDOWS32, /* dwFileOS */
+                VFT_DLL, /* dwFileType */
+                VFT2_UNKNOWN, /* dwFileSubtype */
+                0, /* dwFileDateMS */
+                0, /* dwFileDateLS */
+            },
+        },
+        /* VARFILEINFO */
+        {
+            0x44, /* wLength */
+            0, /* wValueLength */
+            1, /* wType */
+            { 'V','a','r','F','i','l','e','I','n','f','o',0,0 } /* szKey */
+        },
+        /* VAR */
+        {
+            0x24, /* wLength */
+            0x4, /* wValueLength */
+            0, /* wType */
+            { 'T','r','a','n','s','l','a','t','i','o','n',0,0 }, /* szKey */
+            0x4B00000, /* Value */
+        },
+        /* STRINGFILEINFO */
+        {
+            0x19C, /* wLength */
+            0, /* wValueLength */
+            1, /* wType */
+            { 'S','t','r','i','n','g','F','i','l','e','I','n','f','o',0 }, /* szKey */
+        },
+        /* STRINGTABLE */
+        {
+            0x178, /* wLength */
+            0, /* wValueLength */
+            1, /* wType */
+            { '0','0','0','0','0','4','b','0',0 }, /* szKey */
+        },
+        /* STRINGHDR */
+        {
+            0x2C, /* wLength */
+            2, /* wValueLength */
+            1, /* wType */
+        },
+        { 'F','i','l','e','D','e','s','c','r','i','p','t','i','o','n',0,0 }, /* szKey */
+        { ' ',0 }, /* szValue */
+        /* STRINGHDR */
+        {
+            0x30, /* wLength */
+            8, /* wValueLength */
+            1, /* wType */
+        },
+        { 'F','i','l','e','V','e','r','s','i','o','n',0,0 }, /* szKey */
+        { '1','.','0','.','0','.','0',0 }, /* szValue */
+        /* STRINGHDR */
+        {
+            0x34, /* wLength */
+            9, /* wValueLength */
+            1, /* wType */
+        },
+        { 'I','n','t','e','r','n','a','l','N','a','m','e',0 }, /* szKey */
+        { 'w','i','n','e','.','d','l','l',0 }, /* szValue */
+        /* STRINGHDR */
+        {
+            0x28, /* wLength */
+            2, /* wValueLength */
+            1, /* wType */
+        },
+        { 'L','e','g','a','l','C','o','p','y','r','i','g','h','t',0 }, /* szKey */
+        { ' ',0 }, /* szValue */
+        /* STRINGHDR */
+        {
+            0x3C, /* wLength */
+            9, /* wValueLength */
+            1, /* wType */
+        },
+        { 'O','r','i','g','i','n','a','l','F','i','l','e','n','a','m','e',0 }, /* szKey */
+        { 'w','i','n','e','.','d','l','l',0,0 }, /* szValue */
+        /* STRINGHDR */
+        {
+            0x34, /* wLength */
+            8, /* wValueLength */
+            1, /* wType */
+        },
+        { 'P','r','o','d','u','c','t','V','e','r','s','i','o','n',0 }, /* szKey */
+        { '1','.','0','.','0','.','0',0 }, /* szValue */
+        /* STRINGHDR */
+        {
+            0x38, /* wLength */
+            8, /* wValueLength */
+            1, /* wType */
+        },
+        { 'A','s','s','e','m','b','l','y',' ','V','e','r','s','i','o','n',0 }, /* szKey */
+        { '1','.','0','.','0','.','0',0 }, /* szValue */
+};
+
+static void create_executable(const CHAR *name)
+{
+    HANDLE file;
+    DWORD written;
+
+    file = CreateFileA(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
+    ok(file != INVALID_HANDLE_VALUE, "Failure to open file %s\n", name);
+    WriteFile(file, &executable,sizeof(struct _executable), &written, NULL);
+    CloseHandle(file);
+}
+
 static void test_info_size(void)
 {   DWORD hdl, retval;
     char mypath[MAX_PATH] = "";
@@ -183,6 +532,27 @@ static void test_info_size(void)
        "Expected ERROR_RESOURCE_DATA_NOT_FOUND, got %d\n", GetLastError());
 
     DeleteFileA("test.txt");
+
+    /* Init nameless unions*/
+    U1(executable.labelres).Name = 0x10;
+    U2(executable.labelres).OffsetToData = 0x80000018;
+    U1(executable.label11res).Name = 0x1;
+    U2(executable.label11res).OffsetToData = 0x80000030;
+    U1(executable.label10res).Name = 0x0;
+    U2(executable.label10res).OffsetToData = 0x48;
+
+    /* virtual size larger than raw size thus needing padding up to virtual size */
+    executable.rsrc.SizeOfRawData = 0x1;
+    create_executable("test2.exe");
+
+    hdl = 0xcafe;
+
+    retval = GetFileVersionInfoSizeA("test2.exe", &hdl);
+    ok(retval == 0, "Expected 0, got %d\n", retval);
+    ok(hdl == 0, "Expected 0, got %d\n", hdl);
+
+    DeleteFileA("test2.exe");
+    executable.rsrc.SizeOfRawData = 0x400;
 }
 
 static void VersionDwordLong2String(DWORDLONG Version, LPSTR lpszVerString)
-- 
1.7.2.3


More information about the wine-patches mailing list