[win32k]
authorGiannis Adamopoulos <gadamopoulos@reactos.org>
Sun, 20 Mar 2011 14:28:12 +0000 (14:28 +0000)
committerGiannis Adamopoulos <gadamopoulos@reactos.org>
Sun, 20 Mar 2011 14:28:12 +0000 (14:28 +0000)
- Fix disconnecting from a desktop when IntSetThreadDesktop gets NULL parameter

svn path=/trunk/; revision=51101

reactos/subsystems/win32/win32k/ntuser/desktop.c

index f56d587..0a240ad 100644 (file)
@@ -1798,7 +1798,7 @@ BOOL
 IntSetThreadDesktop(IN HDESK hDesktop,
                     IN BOOL FreeOnFailure)
 {
 IntSetThreadDesktop(IN HDESK hDesktop,
                     IN BOOL FreeOnFailure)
 {
-    PDESKTOP DesktopObject, OldDesktop;
+    PDESKTOP DesktopObject = NULL, OldDesktop;
     HDESK hOldDesktop;
     PTHREADINFO W32Thread;
     NTSTATUS Status;
     HDESK hOldDesktop;
     PTHREADINFO W32Thread;
     NTSTATUS Status;
@@ -1809,24 +1809,28 @@ IntSetThreadDesktop(IN HDESK hDesktop,
     MapHeap = (PsGetCurrentProcess() != PsInitialSystemProcess);
     W32Thread = PsGetCurrentThreadWin32Thread();
     
     MapHeap = (PsGetCurrentProcess() != PsInitialSystemProcess);
     W32Thread = PsGetCurrentThreadWin32Thread();
     
-    /* Validate the new desktop. */
-    Status = IntValidateDesktopHandle(
-                hDesktop,
-                UserMode,
-                0,
-                &DesktopObject);
-
-    if (!NT_SUCCESS(Status))
+    if(hDesktop != NULL)
     {
     {
-        DPRINT("Validation of desktop handle (0x%X) failed\n", hDesktop);
-        return FALSE;
-    }
+        /* Validate the new desktop. */
+        Status = IntValidateDesktopHandle(
+                    hDesktop,
+                    UserMode,
+                    0,
+                    &DesktopObject);
+
+        if (!NT_SUCCESS(Status))
+        {
+            DPRINT1("Validation of desktop handle (0x%X) failed\n", hDesktop);
+            return FALSE;
+        }
+
+        if (W32Thread->rpdesk == DesktopObject)
+        {
+            /* Nothing to do */
+            ObDereferenceObject(DesktopObject);
+            return TRUE;
+        }
 
 
-    if (W32Thread->rpdesk == DesktopObject)
-    {
-        /* Nothing to do */
-        ObDereferenceObject(DesktopObject);
-        return TRUE;
     }
 
     if (!IsListEmpty(&W32Thread->WindowListHead))
     }
 
     if (!IsListEmpty(&W32Thread->WindowListHead))