Module: wine Branch: master Commit: 4bf9d2403f269e7f3595ad075a4afee9adbda51f URL: https://source.winehq.org/git/wine.git/?a=commit;h=4bf9d2403f269e7f3595ad075...
Author: Alexandre Julliard julliard@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@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;