Henri Verbeet : ntdll: Do not return STATUS_SUCCESS on failure in NtQueryObject().

Alexandre Julliard julliard at winehq.org
Wed Sep 15 18:18:38 CDT 2010


Module: wine
Branch: master
Commit: 689c45b9b9f1815e9567d26570a491f6692d61d5
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=689c45b9b9f1815e9567d26570a491f6692d61d5

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Wed Sep 15 12:00:03 2010 +0200

ntdll: Do not return STATUS_SUCCESS on failure in NtQueryObject().

---

 dlls/ntdll/om.c       |    8 +++++---
 dlls/ntdll/tests/om.c |   22 +++++++++++++++++++---
 2 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/dlls/ntdll/om.c b/dlls/ntdll/om.c
index 0e64ddd..85ac0bf 100644
--- a/dlls/ntdll/om.c
+++ b/dlls/ntdll/om.c
@@ -95,18 +95,20 @@ NTSTATUS WINAPI NtQueryObject(IN HANDLE handle,
             if (!(status = server_get_unix_name( handle, &unix_name )))
             {
                 UNICODE_STRING nt_name;
-                NTSTATUS status;
 
                 if (!(status = wine_unix_to_nt_file_name( &unix_name, &nt_name )))
                 {
-                    if (sizeof(*p) + nt_name.MaximumLength <= len)
+                    if (len < sizeof(*p))
+                        status = STATUS_INFO_LENGTH_MISMATCH;
+                    else if (len < sizeof(*p) + nt_name.MaximumLength)
+                        status = STATUS_BUFFER_OVERFLOW;
+                    else
                     {
                         p->Name.Buffer = (WCHAR *)(p + 1);
                         p->Name.Length = nt_name.Length;
                         p->Name.MaximumLength = nt_name.MaximumLength;
                         memcpy( p->Name.Buffer, nt_name.Buffer, nt_name.MaximumLength );
                     }
-                    else status = STATUS_INFO_LENGTH_MISMATCH;
                     if (used_len) *used_len = sizeof(*p) + nt_name.MaximumLength;
                     RtlFreeUnicodeString( &nt_name );
                 }
diff --git a/dlls/ntdll/tests/om.c b/dlls/ntdll/tests/om.c
index c6a3cbf..7c03886 100644
--- a/dlls/ntdll/tests/om.c
+++ b/dlls/ntdll/tests/om.c
@@ -661,7 +661,7 @@ static void test_query_object(void)
     HANDLE handle;
     char buffer[1024];
     NTSTATUS status;
-    ULONG len;
+    ULONG len, expected_len;
     UNICODE_STRING *str;
     char dir[MAX_PATH];
 
@@ -713,10 +713,26 @@ static void test_query_object(void)
     ok( status == STATUS_SUCCESS, "NtQueryObject failed %x\n", status );
     ok( len > sizeof(UNICODE_STRING), "unexpected len %u\n", len );
     str = (UNICODE_STRING *)buffer;
-    ok( sizeof(UNICODE_STRING) + str->Length + sizeof(WCHAR) == len ||
-        broken(sizeof(UNICODE_STRING) + str->Length == len), /* NT4 */
+    expected_len = sizeof(UNICODE_STRING) + str->Length + sizeof(WCHAR);
+    ok( len == expected_len || broken(len == expected_len - sizeof(WCHAR)), /* NT4 */
         "unexpected len %u\n", len );
     trace( "got %s len %u\n", wine_dbgstr_w(str->Buffer), len );
+
+    len = 0;
+    status = pNtQueryObject( handle, ObjectNameInformation, buffer, 0, &len );
+    ok( status == STATUS_INFO_LENGTH_MISMATCH || broken(status == STATUS_INSUFFICIENT_RESOURCES),
+        "NtQueryObject failed %x\n", status );
+    ok( len == expected_len || broken(!len || len == sizeof(UNICODE_STRING)),
+        "unexpected len %u\n", len );
+
+    len = 0;
+    status = pNtQueryObject( handle, ObjectNameInformation, buffer, sizeof(UNICODE_STRING), &len );
+    ok( status == STATUS_BUFFER_OVERFLOW || broken(status == STATUS_INSUFFICIENT_RESOURCES
+            || status == STATUS_INFO_LENGTH_MISMATCH),
+        "NtQueryObject failed %x\n", status );
+    ok( len == expected_len || broken(!len),
+        "unexpected len %u\n", len );
+
     pNtClose( handle );
 }
 




More information about the wine-cvs mailing list