From: Mark Jansen mark.jansen@reactos.org
--- dlls/kernelbase/version.c | 7 ++++++- dlls/version/tests/info.c | 1 - 2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/dlls/kernelbase/version.c b/dlls/kernelbase/version.c index 4d5a8a4de93..e3f9ac917a9 100644 --- a/dlls/kernelbase/version.c +++ b/dlls/kernelbase/version.c @@ -1072,6 +1072,7 @@ static BOOL VersionInfo32_QueryValue( const VS_VERSION_INFO_STRUCT32 *info, LPCW LPVOID *lplpBuffer, UINT *puLen, BOOL *pbText ) { TRACE("lpSubBlock : (%s)\n", debugstr_w(lpSubBlock)); + PVOID Ptr;
while ( *lpSubBlock ) { @@ -1102,7 +1103,11 @@ static BOOL VersionInfo32_QueryValue( const VS_VERSION_INFO_STRUCT32 *info, LPCW }
/* Return value */ - *lplpBuffer = VersionInfo32_Value( info ); + Ptr = VersionInfo32_Value(info); + if ((PBYTE)Ptr >= ((PBYTE)info + info->wLength)) + Ptr = info->szKey + wcslen(info->szKey); + + *lplpBuffer = Ptr; if (puLen) *puLen = info->wValueLength; if (pbText) diff --git a/dlls/version/tests/info.c b/dlls/version/tests/info.c index dcde1bf096f..4472d901f18 100644 --- a/dlls/version/tests/info.c +++ b/dlls/version/tests/info.c @@ -701,7 +701,6 @@ static void test_VerQueryValue_EmptyData(void) ret = VerQueryValueW(ver, L"\StringFileInfo\FFFF0000\FileVersion", (LPVOID *)&p, &len); ok(ret, "VerQueryValueW error %u\n", GetLastError()); ok(len == 0, "VerQueryValueW returned %u, expected 0\n", len); - todo_wine ok(p == (ver + offsetof(rsrc_section_t, FileVersion_key) + 11 * sizeof(WCHAR)), "p was %p, expected %p\n", p, ver + offsetof(rsrc_section_t, FileVersion_key) + 11 * sizeof(WCHAR));
/* The key behind it, to show that parsing continues just fine */