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