[NTOS/SE]
authorJérôme Gardou <jerome.gardou@reactos.org>
Wed, 8 Oct 2014 19:50:14 +0000 (19:50 +0000)
committerJérôme Gardou <jerome.gardou@reactos.org>
Wed, 8 Oct 2014 19:50:14 +0000 (19:50 +0000)
 - Correctly reference/dereference token object when the set token is already in use.

svn path=/trunk/; revision=64619

reactos/ntoskrnl/se/token.c

index f476cd6..4acfb34 100644 (file)
@@ -243,19 +243,28 @@ SeExchangePrimaryToken(PEPROCESS Process,
         if (OldToken == NewToken)
         {
             /* So it's a nop. */
-            PsDereferencePrimaryToken(OldToken);
+            *OldTokenP = OldToken;
             return STATUS_SUCCESS;
         }
 
         Status = SepCompareTokens(OldToken, NewToken, &IsEqual);
         if (!NT_SUCCESS(Status))
         {
+            *OldTokenP = NULL;
             PsDereferencePrimaryToken(OldToken);
             return Status;
         }
 
-        PsDereferencePrimaryToken(OldToken);
-        return IsEqual ? STATUS_SUCCESS : STATUS_TOKEN_ALREADY_IN_USE;
+        if (!IsEqual)
+        {
+            *OldTokenP = NULL;
+            PsDereferencePrimaryToken(OldToken);
+            return STATUS_TOKEN_ALREADY_IN_USE;
+        }
+        /* Silently return STATUS_SUCCESS but do not set the new token,
+         * as it's already in use elsewhere. */
+        *OldTokenP = OldToken;
+        return STATUS_SUCCESS;
     }
 
     /* Mark new token in use */