From 412f0d26d0f31698b509ba403eb14a3994564449 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Wed, 25 May 2016 10:27:17 +0000 Subject: [PATCH 1/1] [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 --- reactos/ntoskrnl/ex/resource.c | 4 ++-- rostests/kmtests/ntos_ex/ExResource.c | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) 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(); -- 2.17.1