fixed wrong buffer check in NtDuplicateToken and added buffer checks in NtOpenThreadTokenEx
Modified: trunk/reactos/ntoskrnl/se/token.c

Modified: trunk/reactos/ntoskrnl/se/token.c
--- trunk/reactos/ntoskrnl/se/token.c	2005-02-13 21:32:50 UTC (rev 13540)
+++ trunk/reactos/ntoskrnl/se/token.c	2005-02-13 22:00:36 UTC (rev 13541)
@@ -136,27 +136,6 @@
   PVOID EndMem;
   PTOKEN AccessToken;
   NTSTATUS Status;
-  
-  if(PreviousMode != KernelMode)
-  {
-    Status = STATUS_SUCCESS;
-    _SEH_TRY
-    {
-      ProbeForWrite(NewAccessToken,
-                    sizeof(TOKEN),
-                    sizeof(ULONG));
-    }
-    _SEH_HANDLE
-    {
-      Status = _SEH_GetExceptionCode();
-    }
-    _SEH_END;
-    
-    if(!NT_SUCCESS(Status))
-    {
-      return Status;
-    }
-  }
 
   Status = ObCreateObject(PreviousMode,
 			  SepTokenObjectType,
@@ -263,17 +242,8 @@
 
   if ( NT_SUCCESS(Status) )
     {
-      _SEH_TRY
-      {
-        *NewAccessToken = AccessToken;
-        Status = STATUS_SUCCESS;
-      }
-      _SEH_HANDLE
-      {
-        Status = _SEH_GetExceptionCode();
-      }
-      _SEH_END;
-      return Status;
+      *NewAccessToken = AccessToken;
+      return(STATUS_SUCCESS);
     }
 
   ObDereferenceObject(AccessToken);
@@ -1068,11 +1038,33 @@
 		 OUT PHANDLE NewTokenHandle)
 {
   KPROCESSOR_MODE PreviousMode;
+  HANDLE hToken;
   PTOKEN Token;
   PTOKEN NewToken;
-  NTSTATUS Status;
+  NTSTATUS Status = STATUS_SUCCESS;
 
   PreviousMode = KeGetPreviousMode();
+  
+  if(PreviousMode != KernelMode)
+  {
+    _SEH_TRY
+    {
+      ProbeForWrite(NewTokenHandle,
+                    sizeof(HANDLE),
+                    sizeof(ULONG));
+    }
+    _SEH_HANDLE
+    {
+      Status = _SEH_GetExceptionCode();
+    }
+    _SEH_END;
+
+    if(!NT_SUCCESS(Status))
+    {
+      return Status;
+    }
+  }
+  
   Status = ObReferenceObjectByHandle(ExistingTokenHandle,
 				     TOKEN_DUPLICATE,
 				     SepTokenObjectType,
@@ -1108,17 +1100,24 @@
 			  DesiredAccess,
 			  0,
 			  NULL,
-			  NewTokenHandle);
+			  &hToken);
 
   ObDereferenceObject(NewToken);
 
-  if (!NT_SUCCESS(Status))
+  if (NT_SUCCESS(Status))
     {
-      DPRINT1("Failed to create token handle (Status %lx)\n");
-      return Status;
+      _SEH_TRY
+      {
+        *NewTokenHandle = hToken;
+      }
+      _SEH_HANDLE
+      {
+        Status = _SEH_GetExceptionCode();
+      }
+      _SEH_END;
     }
 
-  return STATUS_SUCCESS;
+  return Status;
 }
 
 
@@ -1846,6 +1845,7 @@
                     OUT PHANDLE TokenHandle)
 {
   PETHREAD Thread;
+  HANDLE hToken;
   PTOKEN Token, NewToken, PrimaryToken;
   BOOLEAN CopyOnOpen, EffectiveOnly;
   SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
@@ -1853,7 +1853,30 @@
   OBJECT_ATTRIBUTES ObjectAttributes;
   SECURITY_DESCRIPTOR SecurityDescriptor;
   PACL Dacl = NULL;
-  NTSTATUS Status;
+  KPROCESSOR_MODE PreviousMode;
+  NTSTATUS Status = STATUS_SUCCESS;
+  
+  PreviousMode = ExGetPreviousMode();
+  
+  if(PreviousMode != KernelMode)
+  {
+    _SEH_TRY
+    {
+      ProbeForWrite(TokenHandle,
+                    sizeof(HANDLE),
+                    sizeof(ULONG));
+    }
+    _SEH_HANDLE
+    {
+      Status = _SEH_GetExceptionCode();
+    }
+    _SEH_END;
+    
+    if(!NT_SUCCESS(Status))
+    {
+      return Status;
+    }
+  }
 
   /*
    * At first open the thread token for information access and verify
@@ -1861,7 +1884,7 @@
    */
 
   Status = ObReferenceObjectByHandle(ThreadHandle, THREAD_QUERY_INFORMATION,
-                                     PsThreadType, UserMode, (PVOID*)&Thread,
+                                     PsThreadType, PreviousMode, (PVOID*)&Thread,
                                      NULL);
   if (!NT_SUCCESS(Status))
     {
@@ -1896,7 +1919,7 @@
   if (CopyOnOpen)
     {
       Status = ObReferenceObjectByHandle(ThreadHandle, THREAD_ALL_ACCESS,
-                                         PsThreadType, UserMode,
+                                         PsThreadType, PreviousMode,
                                          (PVOID*)&Thread, NULL);
       if (!NT_SUCCESS(Status))
         {
@@ -1945,7 +1968,7 @@
         }
 
       Status = ObInsertObject(NewToken, NULL, DesiredAccess, 0, NULL,
-                              TokenHandle);
+                              &hToken);
 
       ObfDereferenceObject(NewToken);
     }
@@ -1953,7 +1976,7 @@
     {
       Status = ObOpenObjectByPointer(Token, HandleAttributes,
                                      NULL, DesiredAccess, SepTokenObjectType,
-                                     ExGetPreviousMode(), TokenHandle);
+                                     PreviousMode, &hToken);
     }
 
   ObfDereferenceObject(Token);
@@ -1963,6 +1986,19 @@
       PsRestoreImpersonation(PsGetCurrentThread(), &ImpersonationState);
     }
 
+  if(NT_SUCCESS(Status))
+  {
+    _SEH_TRY
+    {
+      *TokenHandle = hToken;
+    }
+    _SEH_HANDLE
+    {
+      Status = _SEH_GetExceptionCode();
+    }
+    _SEH_END;
+  }
+
   return Status;
 }