Alexandre Julliard : ntdll: Fix the return value of NtQueryKey for a short buffer.

Alexandre Julliard julliard at winehq.org
Wed Jul 6 16:55:53 CDT 2022


Module: wine
Branch: master
Commit: 4bf9d2403f269e7f3595ad075a4afee9adbda51f
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=4bf9d2403f269e7f3595ad075a4afee9adbda51f

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Jul  6 12:46:50 2022 +0200

ntdll: Fix the return value of NtQueryKey for a short buffer.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/tests/reg.c     | 16 +++++++++++++++-
 dlls/ntdll/unix/registry.c |  8 ++------
 2 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/dlls/ntdll/tests/reg.c b/dlls/ntdll/tests/reg.c
index 242a5b5e898..54e9b10e530 100644
--- a/dlls/ntdll/tests/reg.c
+++ b/dlls/ntdll/tests/reg.c
@@ -1817,10 +1817,23 @@ static void test_NtQueryKey(void)
         pNtClose(key);
         return;
     }
-    todo_wine ok(status == STATUS_BUFFER_TOO_SMALL, "NtQueryKey Failed: 0x%08lx\n", status);
+    ok(status == STATUS_BUFFER_TOO_SMALL, "NtQueryKey Failed: 0x%08lx\n", status);
     info = HeapAlloc(GetProcessHeap(), 0, length);
 
     /* non-zero buffer size, but insufficient */
+    len = 0;
+    status = pNtQueryKey(key, KeyNameInformation, info, 1, &len);
+    ok(status == STATUS_BUFFER_TOO_SMALL, "NtQueryKey Failed: 0x%08lx\n", status);
+    ok(length == len, "got %ld, expected %ld\n", len, length);
+    len = 0;
+    status = pNtQueryKey(key, KeyNameInformation, info, offsetof( KEY_NAME_INFORMATION, Name ) - 1, &len);
+    ok(status == STATUS_BUFFER_TOO_SMALL, "NtQueryKey Failed: 0x%08lx\n", status);
+    ok(length == len, "got %ld, expected %ld\n", len, length);
+    len = 0;
+    status = pNtQueryKey(key, KeyNameInformation, info, offsetof( KEY_NAME_INFORMATION, Name ), &len);
+    ok(status == STATUS_BUFFER_OVERFLOW, "NtQueryKey Failed: 0x%08lx\n", status);
+    ok(length == len, "got %ld, expected %ld\n", len, length);
+    len = 0;
     status = pNtQueryKey(key, KeyNameInformation, info, sizeof(*info), &len);
     ok(status == STATUS_BUFFER_OVERFLOW, "NtQueryKey Failed: 0x%08lx\n", status);
     ok(length == len, "got %ld, expected %ld\n", len, length);
@@ -1828,6 +1841,7 @@ static void test_NtQueryKey(void)
        info->NameLength, winetestpath.Length);
 
     /* correct buffer size */
+    len = 0;
     status = pNtQueryKey(key, KeyNameInformation, info, length, &len);
     ok(status == STATUS_SUCCESS, "NtQueryKey Failed: 0x%08lx\n", status);
     ok(length == len, "got %ld, expected %ld\n", len, length);
diff --git a/dlls/ntdll/unix/registry.c b/dlls/ntdll/unix/registry.c
index 9c98bf48399..428f8c9eb3c 100644
--- a/dlls/ntdll/unix/registry.c
+++ b/dlls/ntdll/unix/registry.c
@@ -268,7 +268,6 @@ static NTSTATUS enumerate_key( HANDLE handle, int index, KEY_INFORMATION_CLASS i
             case KeyBasicInformation:
             {
                 KEY_BASIC_INFORMATION keyinfo;
-                fixed_size = (char *)keyinfo.Name - (char *)&keyinfo;
                 keyinfo.LastWriteTime.QuadPart = reply->modif;
                 keyinfo.TitleIndex = 0;
                 keyinfo.NameLength = reply->namelen;
@@ -279,7 +278,6 @@ static NTSTATUS enumerate_key( HANDLE handle, int index, KEY_INFORMATION_CLASS i
             case KeyFullInformation:
             {
                 KEY_FULL_INFORMATION keyinfo;
-                fixed_size = (char *)keyinfo.Class - (char *)&keyinfo;
                 keyinfo.LastWriteTime.QuadPart = reply->modif;
                 keyinfo.TitleIndex = 0;
                 keyinfo.ClassLength = wine_server_reply_size(reply);
@@ -297,7 +295,6 @@ static NTSTATUS enumerate_key( HANDLE handle, int index, KEY_INFORMATION_CLASS i
             case KeyNodeInformation:
             {
                 KEY_NODE_INFORMATION keyinfo;
-                fixed_size = (char *)keyinfo.Name - (char *)&keyinfo;
                 keyinfo.LastWriteTime.QuadPart = reply->modif;
                 keyinfo.TitleIndex = 0;
                 if (reply->namelen < wine_server_reply_size(reply))
@@ -318,7 +315,6 @@ static NTSTATUS enumerate_key( HANDLE handle, int index, KEY_INFORMATION_CLASS i
             case KeyNameInformation:
             {
                 KEY_NAME_INFORMATION keyinfo;
-                fixed_size = (char *)keyinfo.Name - (char *)&keyinfo;
                 keyinfo.NameLength = reply->namelen;
                 memcpy( info, &keyinfo, min( length, fixed_size ) );
                 break;
@@ -327,7 +323,6 @@ static NTSTATUS enumerate_key( HANDLE handle, int index, KEY_INFORMATION_CLASS i
             case KeyCachedInformation:
             {
                 KEY_CACHED_INFORMATION keyinfo;
-                fixed_size = sizeof(keyinfo);
                 keyinfo.LastWriteTime.QuadPart = reply->modif;
                 keyinfo.TitleIndex = 0;
                 keyinfo.SubKeys = reply->subkeys;
@@ -344,7 +339,8 @@ static NTSTATUS enumerate_key( HANDLE handle, int index, KEY_INFORMATION_CLASS i
                 break;
             }
             *result_len = fixed_size + reply->total;
-            if (length < *result_len) ret = STATUS_BUFFER_OVERFLOW;
+            if (length < fixed_size) ret = STATUS_BUFFER_TOO_SMALL;
+            else if (length < *result_len) ret = STATUS_BUFFER_OVERFLOW;
         }
     }
     SERVER_END_REQ;




More information about the wine-cvs mailing list