Module: wine Branch: stable Commit: 85b003cb2e08a6e45b64413dcb4ce34f60dccdea URL: http://source.winehq.org/git/wine.git/?a=commit;h=85b003cb2e08a6e45b64413dcb...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Mar 15 14:06:29 2016 +0900
advapi32: Fix null termination in RegQueryInfoKeyA.
Signed-off-by: Alexandre Julliard julliard@winehq.org (cherry picked from commit 303daeef58b7fe56ef991dde8504d65c11924937) Signed-off-by: Michael Stefaniuc mstefani@winehq.org
---
dlls/advapi32/registry.c | 2 +- dlls/advapi32/tests/registry.c | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-)
diff --git a/dlls/advapi32/registry.c b/dlls/advapi32/registry.c index 4f33fe6..0b40a8d 100644 --- a/dlls/advapi32/registry.c +++ b/dlls/advapi32/registry.c @@ -1091,12 +1091,12 @@ LSTATUS WINAPI RegQueryInfoKeyA( HKEY hkey, LPSTR class, LPDWORD class_len, LPDW (WCHAR *)(buf_ptr + info->ClassOffset), info->ClassLength ); if (len) { - class[len - 1] = 0; if (*class_len + 1 > len) { status = STATUS_BUFFER_OVERFLOW; *class_len -= 1; } + class[*class_len] = 0; } } else status = STATUS_SUCCESS; diff --git a/dlls/advapi32/tests/registry.c b/dlls/advapi32/tests/registry.c index 254a8b6..b798129 100644 --- a/dlls/advapi32/tests/registry.c +++ b/dlls/advapi32/tests/registry.c @@ -1985,6 +1985,17 @@ static void test_reg_query_info(void) "classbuffer = "%.*s", expected %s\n", (int)sizeof(classbuffer), classbuffer, expectbuffer);
+ memset(classbuffer, 0x55, sizeof(classbuffer)); + classlen = 0xdeadbeef; + ret = RegQueryInfoKeyA(subkey, classbuffer, &classlen, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + ok(ret == ERROR_SUCCESS, "ret = %d\n", ret); + ok(classlen == sizeof(subkey_class) - 1, "classlen = %u\n", classlen); + memset(expectbuffer, 0x55, sizeof(expectbuffer)); + strcpy(expectbuffer, subkey_class); + ok(!memcmp(classbuffer, expectbuffer, sizeof(classbuffer)), + "classbuffer = "%.*s", expected %s\n", + (int)sizeof(classbuffer), classbuffer, expectbuffer); + memset(classbufferW, 0x55, sizeof(classbufferW)); classlen = sizeof(subkey_class); ret = RegQueryInfoKeyW(subkey, classbufferW, &classlen, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); @@ -1996,6 +2007,17 @@ static void test_reg_query_info(void) "classbufferW = %s, expected %s\n", wine_dbgstr_wn(classbufferW, sizeof(classbufferW) / sizeof(WCHAR)), wine_dbgstr_w(expectbufferW));
+ memset(classbufferW, 0x55, sizeof(classbufferW)); + classlen = 0xdeadbeef; + ret = RegQueryInfoKeyW(subkey, classbufferW, &classlen, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + ok(ret == ERROR_SUCCESS, "ret = %d\n", ret); + ok(classlen == sizeof(subkey_class) - 1, "classlen = %u\n", classlen); + memset(expectbufferW, 0x55, sizeof(expectbufferW)); + lstrcpyW(expectbufferW, subkey_classW); + ok(!memcmp(classbufferW, expectbufferW, sizeof(classbufferW)), + "classbufferW = %s, expected %s\n", + wine_dbgstr_wn(classbufferW, sizeof(classbufferW) / sizeof(WCHAR)), wine_dbgstr_w(expectbufferW)); + RegDeleteKeyA(subsubkey, ""); RegCloseKey(subsubkey); RegDeleteKeyA(subkey, "");