>> 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;
     }


Reply via email to