[WIN32K:NTUSER]
authorThomas Faber <thomas.faber@reactos.org>
Fri, 15 Apr 2016 20:43:25 +0000 (20:43 +0000)
committerThomas Faber <thomas.faber@reactos.org>
Fri, 15 Apr 2016 20:43:25 +0000 (20:43 +0000)
- Don't access WindowStationName after free
- Handle RtlCreateAtomTable failure

svn path=/trunk/; revision=71165

reactos/win32ss/user/ntuser/winsta.c

index 4ab1703..9711658 100644 (file)
@@ -454,7 +454,7 @@ NtUserCreateWindowStation(
 
     if (!NT_SUCCESS(Status))
     {
-        ERR("ObCreateObject failed for window station %wZ\n", &WindowStationName);
+        ERR("ObCreateObject failed with %lx for window station %wZ\n", Status, &WindowStationName);
         ExFreePoolWithTag(WindowStationName.Buffer, TAG_STRING);
         SetLastNtError(STATUS_INSUFFICIENT_RESOURCES);
         return 0;
@@ -464,9 +464,16 @@ NtUserCreateWindowStation(
     RtlZeroMemory(WindowStationObject, sizeof(WINSTATION_OBJECT));
 
     InitializeListHead(&WindowStationObject->DesktopListHead);
-    Status = RtlCreateAtomTable(37, &WindowStationObject->AtomTable);
     WindowStationObject->Name = WindowStationName;
     WindowStationObject->dwSessionId = NtCurrentPeb()->SessionId;
+    Status = RtlCreateAtomTable(37, &WindowStationObject->AtomTable);
+    if (!NT_SUCCESS(Status))
+    {
+        ERR("RtlCreateAtomTable failed with %lx for window station %wZ\n", Status, &WindowStationName);
+        ObDereferenceObject(WindowStationObject);
+        SetLastNtError(STATUS_INSUFFICIENT_RESOURCES);
+        return 0;
+    }
 
     Status = ObInsertObject((PVOID)WindowStationObject,
                             NULL,
@@ -477,7 +484,7 @@ NtUserCreateWindowStation(
 
     if (!NT_SUCCESS(Status))
     {
-        ERR("ObInsertObject failed for window station %wZ\n", &WindowStationName);
+        ERR("ObInsertObject failed with %lx for window station\n", Status);
         SetLastNtError(STATUS_INSUFFICIENT_RESOURCES);
         return 0;
     }