[1/2] ntdll: Extended parameter check for NtOpenKey
Nikolay Sivov
bunglehead at gmail.com
Thu Jan 8 17:41:55 CST 2009
Changelog:
- fix 2 existing todos at NtOpenKey test
- added tests for retkey value reset to NULL
>From 54e5a63c6efb121b417110bdef866b4e7691722a Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <bunglehead at gmail.com>
Date: Fri, 9 Jan 2009 02:07:43 +0300
Subject: Extended parameter check for NtOpenKey
---
dlls/ntdll/reg.c | 23 +++++++++++++++++++----
dlls/ntdll/tests/reg.c | 25 +++++++++++++++++--------
2 files changed, 36 insertions(+), 12 deletions(-)
diff --git a/dlls/ntdll/reg.c b/dlls/ntdll/reg.c
index 0d6a137..d00cdce 100644
--- a/dlls/ntdll/reg.c
+++ b/dlls/ntdll/reg.c
@@ -114,13 +114,28 @@ NTSTATUS WINAPI RtlpNtCreateKey( PHANDLE retkey, ACCESS_MASK access, const OBJEC
NTSTATUS WINAPI NtOpenKey( PHANDLE retkey, ACCESS_MASK access, const OBJECT_ATTRIBUTES *attr )
{
NTSTATUS ret;
- DWORD len = attr->ObjectName->Length;
+ DWORD len;
- TRACE( "(%p,%s,%x,%p)\n", attr->RootDirectory,
- debugstr_us(attr->ObjectName), access, retkey );
+ if (attr)
+ {
+ TRACE( "(%p,%s,%x,%p)\n", attr->RootDirectory,
+ debugstr_us(attr->ObjectName), access, retkey );
+ len = attr->ObjectName->Length;
+ }
+ else
+ {
+ TRACE( "(%p,%x,%p)\n", attr, access, retkey );
+ if (retkey) *retkey = NULL;
+ return STATUS_ACCESS_VIOLATION;
+ }
if (len > MAX_NAME_LENGTH) return STATUS_BUFFER_OVERFLOW;
- if (!retkey) return STATUS_INVALID_PARAMETER;
+ if (!retkey) return STATUS_ACCESS_VIOLATION;
+ if (attr->Length > sizeof(OBJECT_ATTRIBUTES))
+ {
+ if (retkey) *retkey = NULL;
+ return STATUS_INVALID_PARAMETER;
+ }
SERVER_START_REQ( open_key )
{
diff --git a/dlls/ntdll/tests/reg.c b/dlls/ntdll/tests/reg.c
index 0e25c06..6fc8d82 100644
--- a/dlls/ntdll/tests/reg.c
+++ b/dlls/ntdll/tests/reg.c
@@ -336,31 +336,40 @@ static void test_NtOpenKey(void)
OBJECT_ATTRIBUTES attr;
ACCESS_MASK am = KEY_READ;
- if (0)
- {
- /* Crashes Wine */
/* All NULL */
status = pNtOpenKey(NULL, 0, NULL);
ok(status == STATUS_ACCESS_VIOLATION, "Expected STATUS_ACCESS_VIOLATION, got: 0x%08x\n", status);
/* NULL attributes */
+ key = (HANDLE)0xdeadbeef;
status = pNtOpenKey(&key, 0, NULL);
ok(status == STATUS_ACCESS_VIOLATION /* W2K3/XP/W2K */ || status == STATUS_INVALID_PARAMETER /* NT4 */,
"Expected STATUS_ACCESS_VIOLATION or STATUS_INVALID_PARAMETER(NT4), got: 0x%08x\n", status);
- }
+ ok(key == NULL, "Expected NULL handle, got %p\n", key);
InitializeObjectAttributes(&attr, &winetestpath, 0, 0, 0);
/* NULL key */
status = pNtOpenKey(NULL, 0, &attr);
- todo_wine
- ok(status == STATUS_ACCESS_VIOLATION, "Expected STATUS_ACCESS_VIOLATION, got: 0x%08x\n", status);
+ ok(status == STATUS_ACCESS_VIOLATION, "Expected STATUS_ACCESS_VIOLATION, got: 0x%08x\n", status);
+
+ status = pNtOpenKey(NULL, am, &attr);
+ ok(status == STATUS_ACCESS_VIOLATION, "Expected STATUS_ACCESS_VIOLATION, got: 0x%08x\n", status);
+
+ key = (HANDLE)0xdeadbeef;
+ status = pNtOpenKey(&key, am, &attr);
+ ok(status == STATUS_OBJECT_NAME_NOT_FOUND, "Expected STATUS_ACCESS_VIOLATION, got: 0x%08x\n", status);
+ ok(key == NULL, "Expected NULL handle, got %p\n", key);
/* Length > sizeof(OBJECT_ATTRIBUTES) */
+ key = (HANDLE)0xdeadbeef;
attr.Length *= 2;
status = pNtOpenKey(&key, am, &attr);
- todo_wine
- ok(status == STATUS_INVALID_PARAMETER, "Expected STATUS_INVALID_PARAMETER, got: 0x%08x\n", status);
+ ok(status == STATUS_INVALID_PARAMETER, "Expected STATUS_INVALID_PARAMETER, got: 0x%08x\n", status);
+ ok(key == NULL, "Expected NULL handle, got %p\n", key);
+ /* check argument validation order */
+ status = pNtOpenKey(NULL, am, &attr);
+ ok(status == STATUS_ACCESS_VIOLATION, "Expected STATUS_INVALID_PARAMETER, got: 0x%08x\n", status);
}
static void test_NtCreateKey(void)
--
1.5.6.5
More information about the wine-patches
mailing list