From 5550a89326c919fe525c9f41fa6ea7ca96dd3e1c Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Sun, 5 Oct 2014 14:20:08 +0000 Subject: [PATCH] [NTOS/SE] - Do not fail when setting the same primary token for a process. - Fake equality of tokens when both of them are (not) restricted. CORE-8554 #resolve #comment JRE-7u65 now installs fine svn path=/trunk/; revision=64545 --- reactos/ntoskrnl/se/token.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/se/token.c b/reactos/ntoskrnl/se/token.c index 692cf301947..f476cd64e8d 100644 --- a/reactos/ntoskrnl/se/token.c +++ b/reactos/ntoskrnl/se/token.c @@ -108,6 +108,8 @@ SepCompareTokens(IN PTOKEN FirstToken, } /* FIXME: Check if every privilege that is present in either token is also present in the other one */ + DPRINT1("FIXME: Pretending tokens are equal!\n"); + IsEqual = TRUE; } *Equal = IsEqual; @@ -231,7 +233,30 @@ SeExchangePrimaryToken(PEPROCESS Process, PAGED_CODE(); if (NewToken->TokenType != TokenPrimary) return(STATUS_BAD_TOKEN_TYPE); - if (NewToken->TokenInUse) return(STATUS_TOKEN_ALREADY_IN_USE); + if (NewToken->TokenInUse) + { + BOOLEAN IsEqual; + NTSTATUS Status; + + /* Maybe we're trying to set the same token */ + OldToken = PsReferencePrimaryToken(Process); + if (OldToken == NewToken) + { + /* So it's a nop. */ + PsDereferencePrimaryToken(OldToken); + return STATUS_SUCCESS; + } + + Status = SepCompareTokens(OldToken, NewToken, &IsEqual); + if (!NT_SUCCESS(Status)) + { + PsDereferencePrimaryToken(OldToken); + return Status; + } + + PsDereferencePrimaryToken(OldToken); + return IsEqual ? STATUS_SUCCESS : STATUS_TOKEN_ALREADY_IN_USE; + } /* Mark new token in use */ NewToken->TokenInUse = 1; -- 2.17.1