[2/2] ntdll: Fix NtOpenKey return value on different failures

Nikolay Sivov bunglehead at gmail.com
Thu Jan 15 12:59:19 CST 2009


Changelog:
   - Fix NtOpenKey return value on different failures
   - Added some tests for NULL arguments


>From 20e7cb68a69b5337ebea497dc4149e802c7d0608 Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <bunglehead at gmail.com>
Date: Thu, 15 Jan 2009 21:54:09 +0300
Subject:   Make NtOpenKey tests pass on wine (fix error handling)

---
 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 c1b81ec..0398c90 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 );
+    else
+        TRACE( "(%p,%x,%p)\n", attr, access, retkey );
+
+    if (!attr || !retkey)
+    {
+        if (retkey)  *retkey = NULL;
+        return STATUS_ACCESS_VIOLATION;
+    }
+
+    len = attr->ObjectName->Length;
 
     if (len > MAX_NAME_LENGTH) return STATUS_BUFFER_OVERFLOW;
-    if (!retkey) return STATUS_INVALID_PARAMETER;
+    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 2230be3..13995e2 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