>> You should write some tests to examine the behavior of VerQueryValue
>> with NULL puLen.
>>
>
> I just found out that wine has a test for it, but it has been commented out:
The attached patch also uncomment the tests.
Cheers,
Rafael
diff --git a/dlls/version/tests/info.c b/dlls/version/tests/info.c
index e689017..5673fba 100644
--- a/dlls/version/tests/info.c
+++ b/dlls/version/tests/info.c
@@ -229,10 +229,6 @@ static void test_info(void)
if (pVersionInfo == 0)
return;
- if (0)
- {
- /* this test crashes on WinNT4
- */
boolret = GetFileVersionInfoA( "kernel32.dll", 0, retval, 0);
ok (!boolret, "GetFileVersionInfoA should have failed: GetLastError = %u\n", GetLastError());
ok ((GetLastError() == ERROR_INVALID_DATA) || (GetLastError() == ERROR_BAD_PATHNAME) ||
@@ -240,7 +236,6 @@ static void test_info(void)
"Last error wrong! ERROR_INVALID_DATA/ERROR_BAD_PATHNAME (ME)/"
"NO_ERROR (95) expected, got %u\n",
GetLastError());
- }
boolret = GetFileVersionInfoA( "kernel32.dll", 0, retval, pVersionInfo );
ok (boolret, "GetFileVersionInfoA failed: GetLastError = %u\n", GetLastError());
@@ -266,13 +261,8 @@ static void test_info(void)
trace("kernel32.dll version: %s\n", VersionString);
- if (0)
- {
- /* this test crashes on WinNT4
- */
boolret = VerQueryValueA( pVersionInfo, backslash, (LPVOID *)&pFixedVersionInfo, 0);
ok (boolret, "VerQueryValue failed: GetLastError = %u\n", GetLastError());
- }
cleanup:
HeapFree( GetProcessHeap(), 0, pVersionInfo);
diff --git a/dlls/version/version.c b/dlls/version/version.c
index bc90dcc..0a2effc 100644
--- a/dlls/version/version.c
+++ b/dlls/version/version.c
@@ -935,7 +935,8 @@ BOOL WINAPI VerQueryValueA( LPCVOID pBlock, LPCSTR lpSubBlock,
len = WideCharToMultiByte(CP_ACP, 0, *lplpBuffer, -1,
lpBufferA + pos, info->wLength - pos, NULL, NULL);
*lplpBuffer = lpBufferA + pos;
- *puLen = len;
+ if (puLen)
+ *puLen = len;
}
return ret;
}
@@ -995,7 +996,8 @@ BOOL WINAPI VerQueryValueW( LPCVOID pBlock, LPCWSTR lpSubBlock,
len = MultiByteToWideChar(CP_ACP, 0, *lplpBuffer, -1,
lpBufferW + pos, max/sizeof(WCHAR) - pos );
*lplpBuffer = lpBufferW + pos;
- *puLen = len;
+ if (puLen)
+ *puLen = len;
}
return ret;
}