From b51f0a0553677f71630433e6c2b40aa938b50ee8 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 15 Jan 2011 14:35:26 +0000 Subject: [PATCH] [NTOSKRNL] Simplify SepPrivilegeCheck. Patch by Timo Kreuzer. svn path=/trunk/; revision=50390 --- reactos/ntoskrnl/se/priv.c | 54 ++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 31 deletions(-) diff --git a/reactos/ntoskrnl/se/priv.c b/reactos/ntoskrnl/se/priv.c index 603194259e0..c692ed305a5 100644 --- a/reactos/ntoskrnl/se/priv.c +++ b/reactos/ntoskrnl/se/priv.c @@ -118,54 +118,46 @@ SepPrivilegeCheck(PTOKEN Token, { ULONG i; ULONG j; - ULONG k; + ULONG Required; DPRINT("SepPrivilegeCheck() called\n"); PAGED_CODE(); if (PreviousMode == KernelMode) - { return TRUE; - } - k = 0; - if (PrivilegeCount > 0) + /* Get the number of privileges that are required to match */ + Required = (PrivilegeControl & PRIVILEGE_SET_ALL_NECESSARY) ? PrivilegeCount : 1; + + /* Loop all requested privileges until we found the required ones */ + for (i = 0; i < PrivilegeCount && Required > 0; i++) { - for (i = 0; i < Token->PrivilegeCount; i++) + /* Loop the privileges of the token */ + for (j = 0; j < Token->PrivilegeCount; j++) { - for (j = 0; j < PrivilegeCount; j++) + /* Check if the LUIDs match */ + if (Token->Privileges[j].Luid.LowPart == Privileges[i].Luid.LowPart && + Token->Privileges[j].Luid.HighPart == Privileges[i].Luid.HighPart) { - if (Token->Privileges[i].Luid.LowPart == Privileges[j].Luid.LowPart && - Token->Privileges[i].Luid.HighPart == Privileges[j].Luid.HighPart) + DPRINT("Found privilege. Attributes: %lx\n", + Token->Privileges[j].Attributes); + + /* Check if the privilege is enabled */ + if (Token->Privileges[j].Attributes & SE_PRIVILEGE_ENABLED) { - DPRINT("Found privilege\n"); - DPRINT("Privilege attributes %lx\n", - Token->Privileges[i].Attributes); - - if (Token->Privileges[i].Attributes & SE_PRIVILEGE_ENABLED) - { - Privileges[j].Attributes |= SE_PRIVILEGE_USED_FOR_ACCESS; - k++; - } + Privileges[i].Attributes |= SE_PRIVILEGE_USED_FOR_ACCESS; + Required--; } + + /* Leave the inner loop */ + break; } } } - if ((PrivilegeControl & PRIVILEGE_SET_ALL_NECESSARY) && - PrivilegeCount == k) - { - return TRUE; - } - - if (k > 0 && - !(PrivilegeControl & PRIVILEGE_SET_ALL_NECESSARY)) - { - return TRUE; - } - - return FALSE; + /* Return whether we found all required privileges */ + return (Required == 0); } NTSTATUS -- 2.17.1