Ken Thomases : ntdll: Fix status returned for too-long registry value names .
Alexandre Julliard
julliard at winehq.org
Tue Mar 13 13:50:35 CDT 2012
Module: wine
Branch: master
Commit: 97645d7a1a9eec6100c637534620ac6811622794
URL: http://source.winehq.org/git/wine.git/?a=commit;h=97645d7a1a9eec6100c637534620ac6811622794
Author: Ken Thomases <ken at codeweavers.com>
Date: Mon Mar 12 22:50:09 2012 -0500
ntdll: Fix status returned for too-long registry value names.
---
dlls/ntdll/reg.c | 6 +++---
dlls/ntdll/tests/reg.c | 36 ++++++++++++++++++++++++++++++++++++
2 files changed, 39 insertions(+), 3 deletions(-)
diff --git a/dlls/ntdll/reg.c b/dlls/ntdll/reg.c
index d68f154..cdca88a 100644
--- a/dlls/ntdll/reg.c
+++ b/dlls/ntdll/reg.c
@@ -190,7 +190,7 @@ NTSTATUS WINAPI NtDeleteValueKey( HANDLE hkey, const UNICODE_STRING *name )
NTSTATUS ret;
TRACE( "(%p,%s)\n", hkey, debugstr_us(name) );
- if (name->Length > MAX_VALUE_LENGTH) return STATUS_BUFFER_OVERFLOW;
+ if (name->Length > MAX_VALUE_LENGTH) return STATUS_OBJECT_NAME_NOT_FOUND;
SERVER_START_REQ( delete_key_value )
{
@@ -483,7 +483,7 @@ NTSTATUS WINAPI NtQueryValueKey( HANDLE handle, const UNICODE_STRING *name,
TRACE( "(%p,%s,%d,%p,%d)\n", handle, debugstr_us(name), info_class, info, length );
- if (name->Length > MAX_VALUE_LENGTH) return STATUS_BUFFER_OVERFLOW;
+ if (name->Length > MAX_VALUE_LENGTH) return STATUS_OBJECT_NAME_NOT_FOUND;
/* compute the length we want to retrieve */
switch(info_class)
@@ -771,7 +771,7 @@ NTSTATUS WINAPI NtSetValueKey( HANDLE hkey, const UNICODE_STRING *name, ULONG Ti
TRACE( "(%p,%s,%d,%p,%d)\n", hkey, debugstr_us(name), type, data, count );
- if (name->Length > MAX_VALUE_LENGTH) return STATUS_BUFFER_OVERFLOW;
+ if (name->Length > MAX_VALUE_LENGTH) return STATUS_INVALID_PARAMETER;
SERVER_START_REQ( set_key_value )
{
diff --git a/dlls/ntdll/tests/reg.c b/dlls/ntdll/tests/reg.c
index 1bd0a01..d56d4f8 100644
--- a/dlls/ntdll/tests/reg.c
+++ b/dlls/ntdll/tests/reg.c
@@ -1244,6 +1244,41 @@ static void test_redirection(void)
pNtClose( key64 );
}
+static void test_long_value_name(void)
+{
+ HANDLE key;
+ NTSTATUS status, expected;
+ OBJECT_ATTRIBUTES attr;
+ UNICODE_STRING ValName;
+ DWORD i;
+
+ InitializeObjectAttributes(&attr, &winetestpath, 0, 0, 0);
+ status = pNtOpenKey(&key, KEY_WRITE|KEY_READ, &attr);
+ ok(status == STATUS_SUCCESS, "NtOpenKey Failed: 0x%08x\n", status);
+
+ ValName.MaximumLength = 0xfffc;
+ ValName.Length = ValName.MaximumLength - sizeof(WCHAR);
+ ValName.Buffer = HeapAlloc(GetProcessHeap(), 0, ValName.MaximumLength);
+ for (i = 0; i < ValName.Length / sizeof(WCHAR); i++)
+ ValName.Buffer[i] = 'a';
+ ValName.Buffer[i] = 0;
+
+ status = pNtDeleteValueKey(key, &ValName);
+ ok(status == STATUS_OBJECT_NAME_NOT_FOUND, "NtDeleteValueKey with nonexistent long value name returned 0x%08x\n", status);
+ status = pNtSetValueKey(key, &ValName, 0, REG_DWORD, &i, sizeof(i));
+ ok(status == STATUS_INVALID_PARAMETER || broken(status == STATUS_SUCCESS) /* nt4 */,
+ "NtSetValueKey with long value name returned 0x%08x\n", status);
+ expected = (status == STATUS_SUCCESS) ? STATUS_SUCCESS : STATUS_OBJECT_NAME_NOT_FOUND;
+ status = pNtDeleteValueKey(key, &ValName);
+ ok(status == expected, "NtDeleteValueKey with long value name returned 0x%08x\n", status);
+
+ status = pNtQueryValueKey(key, &ValName, KeyValueBasicInformation, NULL, 0, &i);
+ ok(status == STATUS_OBJECT_NAME_NOT_FOUND, "NtQueryValueKey with nonexistent long value name returned 0x%08x\n", status);
+
+ pRtlFreeUnicodeString(&ValName);
+ pNtClose(key);
+}
+
START_TEST(reg)
{
static const WCHAR winetest[] = {'\\','W','i','n','e','T','e','s','t',0};
@@ -1265,6 +1300,7 @@ START_TEST(reg)
test_RtlpNtQueryValueKey();
test_NtFlushKey();
test_NtQueryValueKey();
+ test_long_value_name();
test_NtDeleteKey();
test_symlinks();
test_redirection();
More information about the wine-cvs
mailing list