version: Test for VerQueryValueA (try 2)
Mark Jansen
learn0more+wine at gmail.com
Fri Feb 27 14:24:58 CST 2015
This patch supersedes both '[2/2] version: Test for VerQueryValueA'
and '[1/2] version: Fix wrong length reported when selecting a block.
(resend 2)', as it is a better tests, and proves the fix to not work
fully.
The patch shows a difference in handling between wine's VerQueryValue,
and windows' VerQueryValue when selecting a 'BLOCK' object.
Implemented pointer checking and commented the binary structure as
suggested by nsivov from #winehackers.
---
dlls/version/tests/info.c | 118 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 118 insertions(+)
-------------- next part --------------
From cfc2b09d85aa24055d5de31a85a777c1a00c4277 Mon Sep 17 00:00:00 2001
From: Mark Jansen <learn0more+wine at gmail.com>
Date: Thu, 26 Feb 2015 22:59:21 +0100
Subject: [PATCH 4/4] Tests to show selection of a child BLOCK in VerQueryValue
is not correct.
---
dlls/version/tests/info.c | 118 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 118 insertions(+)
diff --git a/dlls/version/tests/info.c b/dlls/version/tests/info.c
index 107cfac..05a7a28 100644
--- a/dlls/version/tests/info.c
+++ b/dlls/version/tests/info.c
@@ -574,6 +574,123 @@ static void test_VerQueryValueA(void)
HeapFree(GetProcessHeap(), 0, ver);
}
+static void test_VerQueryValue_InvalidLength(void)
+{
+ /* this buffer is created with the reactos resource compiler from this resource:
+#include "winver.h"
+
+VS_VERSION_INFO VERSIONINFO
+FILEVERSION 1,0,0,0
+PRODUCTVERSION 1,0,0,0
+FILEFLAGSMASK 63
+FILEFLAGS 0
+FILEOS VOS_UNKNOWN
+FILETYPE VFT_APP
+FILESUBTYPE VFT2_UNKNOWN
+{
+ BLOCK "StringFileInfo"
+ {
+ }
+}
+*/
+ char preparedbuffer[] = {
+ /* VS_VERSION_INFO_STRUCT32 */
+ 0x80, 0x00, /* wLength */
+ 0x34, 0x00, /* wValueLength */
+ 0x00, 0x00, /* wType */
+ /* L"VS_VERSION_INFO" + DWORD alignment */
+ 0x56, 0x00, 0x53, 0x00, 0x5f, 0x00, 0x56, 0x00, 0x45, 0x00, 0x52, 0x00, 0x53, 0x00, 0x49, 0x00, 0x4f,
+ 0x00, 0x4e, 0x00, 0x5f, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ /* VS_FIXEDFILEINFO */
+ 0xbd, 0x04, 0xef, 0xfe, /* dwSignature */
+ 0x00, 0x00, 0x01, 0x00, /* dwStrucVersion */
+ 0x00, 0x00, 0x01, 0x00, /* dwFileVersionMS */
+ 0x00, 0x00, 0x00, 0x00, /* dwFileVersionLS */
+ 0x00, 0x00, 0x01, 0x00, /* dwProductVersionMS */
+ 0x00, 0x00, 0x00, 0x00, /* dwProductVersionLS */
+ 0x3f, 0x00, 0x00, 0x00, /* dwFileFlagsMask */
+ 0x00, 0x00, 0x00, 0x00, /* dwFileFlags */
+ 0x00, 0x00, 0x00, 0x00, /* dwFileOS */
+ 0x01, 0x00, 0x00, 0x00, /* dwFileType */
+ 0x00, 0x00, 0x00, 0x00, /* dwFileSubtype */
+ 0x00, 0x00, 0x00, 0x00, /* dwFileDateMS */
+ 0x00, 0x00, 0x00, 0x00, /* dwFileDateLS */
+
+ /* first child: */
+ 0x24, 0x00, /* wLength */
+ 0x00, 0x00, /* wValueLength */
+ 0x01, 0x00, /* wType */
+ /* L"StringFileInfo" + DWORD alignment */
+ 0x53, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x46, 0x00, 0x69, 0x00,
+ 0x6c, 0x00, 0x65, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x00, 0x00,
+ /* "FE2X" */
+ 0x46, 0x45, 0x32, 0x58,
+
+ /* Extra bytes allocated for W->A conversions. */
+ 0x0d, 0xf0, 0xad, 0xba, 0x0d, 0xf0, 0xad, 0xba, 0x0d, 0xf0, 0xad, 0xba, 0x0d, 0xf0, 0xad, 0xba,
+ 0x0d, 0xf0, 0xad, 0xba, 0x0d, 0xf0, 0xad, 0xba, 0x0d, 0xf0, 0xad, 0xba, 0x0d, 0xf0, 0xad, 0xba,
+ 0x0d, 0xf0, 0xad, 0xba, 0x0d, 0xf0, 0xad, 0xba, 0x0d, 0xf0, 0xad, 0xba, 0x0d, 0xf0, 0xad, 0xba,
+ 0x0d, 0xf0, 0xad, 0xba, 0x0d, 0xf0, 0xad, 0xba, 0x0d, 0xf0, 0xad, 0xba, 0x0d, 0xf0, 0xad, 0xba,
+ 0x0d, 0xf0, 0xad, 0xba, 0x0d, 0xf0, 0xad, 0xba, 0x0d, 0xf0, 0xad, 0xba, 0x0d, 0xf0, 0xad, 0xba,
+ 0x0d, 0xf0, 0xad, 0xba, 0x0d, 0xf0, 0xad, 0xba, 0x0d, 0xf0, 0xad, 0xba, 0x0d, 0xf0, 0xad, 0xba,
+ 0x0d, 0xf0, 0xad, 0xba, 0x0d, 0xf0, 0xad, 0xba, 0x0d, 0xf0, 0xad, 0xba, 0x0d, 0xf0, 0xad, 0xba,
+ 0x0d, 0xf0, 0xad, 0xba, 0x0d, 0xf0, 0xad, 0xba, 0x0d, 0xf0, 0xad, 0xba, 0x0d, 0xf0, 0xad, 0xba,
+ };
+ char *p;
+ UINT len, ret;
+ WCHAR FileDescriptionW[] ={ '\\', '\\', 'S', 't', 'r', 'i', 'n', 'g', 'F', 'i', 'l', 'e', 'I', 'n', 'f', 'o', 0 };
+
+ p = (char *)0xdeadbeef;
+ len = 0xdeadbeef;
+ SetLastError(0xdeadbeef);
+ ret = VerQueryValueA(preparedbuffer, "StringFileInfo", (LPVOID*)&p, &len);
+ ok(ret, "VerQueryValueA error %u\n", GetLastError());
+ ok(len == 0, "VerQueryValueA returned %u, expected 0\n", len);
+ ok(p == (preparedbuffer+0x7e), "p was %p, expected %p\n", p, preparedbuffer + 0x7e);
+
+ p = (char *)0xdeadbeef;
+ len = 0xdeadbeef;
+ SetLastError(0xdeadbeef);
+ ret = VerQueryValueA(preparedbuffer, "\\StringFileInfo", (LPVOID*)&p, &len);
+ ok(ret, "VerQueryValueA error %u\n", GetLastError());
+ ok(len == 0, "VerQueryValueA returned %u, expected 0\n", len);
+ ok(p == (preparedbuffer+0x7e), "p was %p, expected %p\n", p, preparedbuffer + 0x7e);
+
+ p = (char *)0xdeadbeef;
+ len = 0xdeadbeef;
+ SetLastError(0xdeadbeef);
+ ret = VerQueryValueA(preparedbuffer, "\\\\StringFileInfo", (LPVOID*)&p, &len);
+ ok(ret, "VerQueryValueA error %u\n", GetLastError());
+ ok(len == 0, "VerQueryValueA returned %u, expected 0\n", len);
+ ok(p == (preparedbuffer+0x7e), "p was %p, expected %p\n", p, preparedbuffer + 0x7e);
+
+ /* also test the W versions. */
+ p = (char *)0xdeadbeef;
+ len = 0xdeadbeef;
+ SetLastError(0xdeadbeef);
+ ret = VerQueryValueW(preparedbuffer, FileDescriptionW + 2, (LPVOID*)&p, &len);
+ ok(ret, "VerQueryValueW error %u\n", GetLastError());
+ ok(len == 0, "VerQueryValueW returned %u, expected 0\n", len);
+ ok(p == (preparedbuffer+0x7e), "p was %p, expected %p\n", p, preparedbuffer + 0x7e);
+
+ p = (char *)0xdeadbeef;
+ len = 0xdeadbeef;
+ SetLastError(0xdeadbeef);
+ ret = VerQueryValueW(preparedbuffer, FileDescriptionW + 1, (LPVOID*)&p, &len);
+ ok(ret, "VerQueryValueW error %u\n", GetLastError());
+ ok(len == 0, "VerQueryValueW returned %u, expected 0\n", len);
+ ok(p == (preparedbuffer+0x7e), "p was %p, expected %p\n", p, preparedbuffer + 0x7e);
+
+ p = (char *)0xdeadbeef;
+ len = 0xdeadbeef;
+ SetLastError(0xdeadbeef);
+ ret = VerQueryValueW(preparedbuffer, FileDescriptionW, (LPVOID*)&p, &len);
+ ok(ret, "VerQueryValueW error %u\n", GetLastError());
+ ok(len == 0, "VerQueryValueW returned %u, expected 0\n", len);
+ ok(p == (preparedbuffer+0x7e), "p was %p, expected %p\n", p, preparedbuffer + 0x7e);
+}
+
static void test_extra_block(void)
{
WORD extra_block[] = {
@@ -630,5 +747,6 @@ START_TEST(info)
test_info();
test_32bit_win();
test_VerQueryValueA();
+ test_VerQueryValue_InvalidLength();
test_extra_block();
}
--
1.8.3.msysgit.0
More information about the wine-patches
mailing list