Alexandre Julliard : advapi32: Fix null termination in RegQueryInfoKeyA.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Apr 12 06:45:26 CDT 2016


Module: wine
Branch: stable
Commit: 85b003cb2e08a6e45b64413dcb4ce34f60dccdea
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=85b003cb2e08a6e45b64413dcb4ce34f60dccdea

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Mar 15 14:06:29 2016 +0900

advapi32: Fix null termination in RegQueryInfoKeyA.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit 303daeef58b7fe56ef991dde8504d65c11924937)
Signed-off-by: Michael Stefaniuc <mstefani at 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, "");




More information about the wine-cvs mailing list