don't dereference lpTokenAttributes if the caller passed NULL to DuplicateTokenEx Modified: trunk/reactos/lib/advapi32/token/token.c _____
Modified: trunk/reactos/lib/advapi32/token/token.c --- trunk/reactos/lib/advapi32/token/token.c 2005-05-05 12:03:43 UTC (rev 14994) +++ trunk/reactos/lib/advapi32/token/token.c 2005-05-05 12:21:43 UTC (rev 14995) @@ -224,15 +224,13 @@
* @implemented */ BOOL STDCALL -SetThreadToken (PHANDLE ThreadHandle, - HANDLE TokenHandle) +SetThreadToken (IN PHANDLE ThreadHandle OPTIONAL, + IN HANDLE TokenHandle) { NTSTATUS Status; HANDLE hThread;
- hThread = NtCurrentThread(); - if (ThreadHandle != NULL) - hThread = ThreadHandle; + hThread = ((ThreadHandle != NULL) ? *ThreadHandle : NtCurrentThread());
Status = NtSetInformationThread (hThread, ThreadImpersonationToken, @@ -252,12 +250,12 @@ * @implemented */ BOOL STDCALL -DuplicateTokenEx (HANDLE ExistingTokenHandle, - DWORD dwDesiredAccess, - LPSECURITY_ATTRIBUTES lpTokenAttributes, - SECURITY_IMPERSONATION_LEVEL ImpersonationLevel, - TOKEN_TYPE TokenType, - PHANDLE DuplicateTokenHandle) +DuplicateTokenEx (IN HANDLE ExistingTokenHandle, + IN DWORD dwDesiredAccess, + IN LPSECURITY_ATTRIBUTES lpTokenAttributes OPTIONAL, + IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel, + IN TOKEN_TYPE TokenType, + OUT PHANDLE DuplicateTokenHandle) { OBJECT_ATTRIBUTES ObjectAttributes; HANDLE NewToken; @@ -269,20 +267,29 @@ Sqos.ContextTrackingMode = 0; Sqos.EffectiveOnly = FALSE;
- InitializeObjectAttributes( - &ObjectAttributes, - NULL, - lpTokenAttributes->bInheritHandle ? OBJ_INHERIT : 0, - NULL, - lpTokenAttributes->lpSecurityDescriptor - ); - + if (lpTokenAttributes != NULL) + { + InitializeObjectAttributes(&ObjectAttributes, + NULL, + lpTokenAttributes->bInheritHandle ? OBJ_INHERIT : 0, + NULL, + lpTokenAttributes->lpSecurityDescriptor); + } + else + { + InitializeObjectAttributes(&ObjectAttributes, + NULL, + 0, + NULL, + NULL); + } + ObjectAttributes.SecurityQualityOfService = &Sqos; - + Status = NtDuplicateToken (ExistingTokenHandle, dwDesiredAccess, &ObjectAttributes, - Sqos.EffectiveOnly, /* why both here _and_ in Sqos? */ + FALSE, TokenType, &NewToken); if (!NT_SUCCESS(Status)) @@ -299,12 +306,12 @@ * @implemented */ BOOL STDCALL -DuplicateToken (HANDLE ExistingTokenHandle, - SECURITY_IMPERSONATION_LEVEL ImpersonationLevel, - PHANDLE DuplicateTokenHandle) +DuplicateToken (IN HANDLE ExistingTokenHandle, + IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel, + OUT PHANDLE DuplicateTokenHandle) { return DuplicateTokenEx (ExistingTokenHandle, - TOKEN_DUPLICATE | TOKEN_IMPERSONATE | TOKEN_QUERY, + TOKEN_IMPERSONATE | TOKEN_QUERY, NULL, ImpersonationLevel, TokenImpersonation,