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; }