[3/3] advapi32: Write back partial results in RegQueryInfoKeyA.
Thomas Faber
thomas.faber at reactos.org
Tue May 19 09:16:25 CDT 2015
From 5d2823172a62ebdf8dc86fc22aa10df682f47d3b Mon Sep 17 00:00:00 2001
From: Thomas Faber <thomas.faber at reactos.org>
Date: Tue, 19 May 2015 10:05:01 -0400
Subject: advapi32: Write back partial results in RegQueryInfoKeyA.
---
dlls/advapi32/registry.c | 22 +++++++++++-----------
dlls/advapi32/tests/registry.c | 8 ++++----
2 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/dlls/advapi32/registry.c b/dlls/advapi32/registry.c
index 0697c9c..30130b1 100644
--- a/dlls/advapi32/registry.c
+++ b/dlls/advapi32/registry.c
@@ -1049,18 +1049,18 @@ LSTATUS WINAPI RegQueryInfoKeyA( HKEY hkey, LPSTR class, LPDWORD class_len, LPDW
if (status) goto done;
- RtlUnicodeToMultiByteSize( &len, (WCHAR *)(buf_ptr + info->ClassOffset), info->ClassLength);
- if (class_len)
+ len = 0;
+ if (class && class_len) len = *class_len;
+ RtlUnicodeToMultiByteN( class, len, class_len,
+ (WCHAR *)(buf_ptr + info->ClassOffset), info->ClassLength );
+ if (len)
{
- if (*class_len == 0) class = NULL;
- if (class && len + 1 > *class_len) status = STATUS_BUFFER_OVERFLOW;
- *class_len = len;
- }
- if (class && !status)
- {
- RtlUnicodeToMultiByteN( class, len, NULL, (WCHAR *)(buf_ptr + info->ClassOffset),
- info->ClassLength );
- class[len] = 0;
+ class[len - 1] = 0;
+ if (*class_len + 1 > len)
+ {
+ status = STATUS_BUFFER_OVERFLOW;
+ *class_len -= 1;
+ }
}
}
else status = STATUS_SUCCESS;
diff --git a/dlls/advapi32/tests/registry.c b/dlls/advapi32/tests/registry.c
index 2aca837..c801384 100644
--- a/dlls/advapi32/tests/registry.c
+++ b/dlls/advapi32/tests/registry.c
@@ -1815,10 +1815,10 @@ static void test_reg_query_info(void)
classlen = 1;
ret = RegQueryInfoKeyA(subkey, classbuffer, &classlen, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
ok(ret == ERROR_MORE_DATA, "ret = %d\n", ret);
- todo_wine ok(classlen == 0, "classlen = %u\n", classlen);
+ ok(classlen == 0, "classlen = %u\n", classlen);
memset(expectbuffer, 0x55, sizeof(expectbuffer));
expectbuffer[0] = 0;
- todo_wine ok(!memcmp(classbuffer, expectbuffer, sizeof(classbuffer)), "classbuffer was modified\n");
+ ok(!memcmp(classbuffer, expectbuffer, sizeof(classbuffer)), "classbuffer was modified\n");
memset(classbufferW, 0x55, sizeof(classbufferW));
classlen = 1;
@@ -1834,12 +1834,12 @@ static void test_reg_query_info(void)
classlen = sizeof(subkey_class) - 1;
ret = RegQueryInfoKeyA(subkey, classbuffer, &classlen, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
ok(ret == ERROR_MORE_DATA, "ret = %d\n", ret);
- todo_wine ok(classlen == sizeof(subkey_class) - 2, "classlen = %u\n", classlen);
+ ok(classlen == sizeof(subkey_class) - 2, "classlen = %u\n", classlen);
memset(expectbuffer, 0x55, sizeof(expectbuffer));
strcpy(expectbuffer, subkey_class);
expectbuffer[sizeof(subkey_class) - 2] = 0;
expectbuffer[sizeof(subkey_class) - 1] = 0x55;
- todo_wine ok(!memcmp(classbuffer, expectbuffer, sizeof(classbuffer)),
+ ok(!memcmp(classbuffer, expectbuffer, sizeof(classbuffer)),
"classbuffer = %.*s, expected %s\n",
(int)sizeof(classbuffer), classbuffer, expectbuffer);
--
1.7.1
More information about the wine-patches
mailing list