From: Thomas Faber Date: Wed, 25 May 2016 10:27:17 +0000 (+0000) Subject: [NTOS:EX] X-Git-Tag: ReactOS-0.4.2~556 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=412f0d26d0f31698b509ba403eb14a3994564449;hp=6305b9d6453e43a63e7c03eb3733a6ca54cdfcf5 [NTOS:EX] - Use the calling thread instead of the passed-in thread to validate APC status in ExReleaseResourceForThreadLite. The latter can be user-set and might not be a KTHREAD at all. CORE-11315 #resolve svn path=/trunk/; revision=71398 --- diff --git a/reactos/ntoskrnl/ex/resource.c b/reactos/ntoskrnl/ex/resource.c index 362c7780a05..1911ef1813e 100644 --- a/reactos/ntoskrnl/ex/resource.c +++ b/reactos/ntoskrnl/ex/resource.c @@ -1817,7 +1817,7 @@ FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource) { /* Just call the For-Thread function */ - ExReleaseResourceForThreadLite(Resource, (ERESOURCE_THREAD)PsGetCurrentThread()); + ExReleaseResourceForThreadLite(Resource, ExGetCurrentResourceThread()); } /*++ @@ -1855,7 +1855,7 @@ ExReleaseResourceForThreadLite(IN PERESOURCE Resource, /* Sanity checks */ ExpVerifyResource(Resource); - ExpCheckForApcsDisabled(LockHandle.OldIrql, Resource, (PKTHREAD)Thread); + ExpCheckForApcsDisabled(LockHandle.OldIrql, Resource, KeGetCurrentThread()); /* Check if it's exclusively owned */ if (IsOwnedExclusive(Resource)) diff --git a/rostests/kmtests/ntos_ex/ExResource.c b/rostests/kmtests/ntos_ex/ExResource.c index c4241aaaedc..74c2dc88462 100644 --- a/rostests/kmtests/ntos_ex/ExResource.c +++ b/rostests/kmtests/ntos_ex/ExResource.c @@ -504,6 +504,10 @@ TestResourceWithOwner( InitThreadDataEx(&ThreadDataOwner, Res, ExAcquireResourceExclusiveLite, TestOwnerRes); KeEnterCriticalRegion(); + ok_bool_true(ExAcquireResourceExclusiveLite(Res, FALSE), "ExAcquireResourceExclusiveLite returned"); + ExSetResourceOwnerPointer(Res, (PVOID)(ULONG_PTR)3); + ExReleaseResourceForThreadLite(Res, 3); + ok_bool_true(ExAcquireResourceExclusiveLite(Res, FALSE), "ExAcquireResourceExclusiveLite returned"); ExSetResourceOwnerPointer(Res, (PVOID)((ULONG_PTR)Res | 3)); KeLeaveCriticalRegion();