- Correctly use the page heap's lock in RtlLockHeap/RtlUnlockHeap when appropriate. Fixes assertion failure when Global/Local memory allocations are performed concurrently with DPH enabled.

svn path=/trunk/; revision=75152
This commit is contained in:
Thomas Faber 2017-06-20 17:15:43 +00:00
parent 03a1f14142
commit 60382e46c8
3 changed files with 44 additions and 2 deletions

View file

@ -2982,7 +2982,11 @@ RtlLockHeap(IN HANDLE HeapPtr)
{
PHEAP Heap = (PHEAP)HeapPtr;
// FIXME Check for special heap
/* Check for page heap */
if (Heap->ForceFlags & HEAP_FLAG_PAGE_ALLOCS)
{
return RtlpPageHeapLock(Heap);
}
/* Check if it's really a heap */
if (Heap->Signature != HEAP_SIGNATURE) return FALSE;
@ -3015,7 +3019,11 @@ RtlUnlockHeap(HANDLE HeapPtr)
{
PHEAP Heap = (PHEAP)HeapPtr;
// FIXME Check for special heap
/* Check for page heap */
if (Heap->ForceFlags & HEAP_FLAG_PAGE_ALLOCS)
{
return RtlpPageHeapUnlock(Heap);
}
/* Check if it's really a heap */
if (Heap->Signature != HEAP_SIGNATURE) return FALSE;

View file

@ -435,6 +435,12 @@ RtlpPageHeapReAllocate(HANDLE HeapPtr,
PVOID Ptr,
SIZE_T Size);
BOOLEAN NTAPI
RtlpPageHeapLock(HANDLE HeapPtr);
BOOLEAN NTAPI
RtlpPageHeapUnlock(HANDLE HeapPtr);
BOOLEAN NTAPI
RtlpPageHeapGetUserInfo(PVOID HeapHandle,
ULONG Flags,

View file

@ -2349,4 +2349,32 @@ RtlpDphNormalHeapValidate(PDPH_HEAP_ROOT DphRoot,
return RtlValidateHeap(DphRoot->NormalHeap, Flags, BlockInfo);
}
BOOLEAN
NTAPI
RtlpPageHeapLock(HANDLE HeapPtr)
{
PDPH_HEAP_ROOT DphRoot;
/* Get pointer to the heap root */
DphRoot = RtlpDphPointerFromHandle(HeapPtr);
if (!DphRoot) return FALSE;
RtlpDphEnterCriticalSection(DphRoot, DphRoot->HeapFlags);
return TRUE;
}
BOOLEAN
NTAPI
RtlpPageHeapUnlock(HANDLE HeapPtr)
{
PDPH_HEAP_ROOT DphRoot;
/* Get pointer to the heap root */
DphRoot = RtlpDphPointerFromHandle(HeapPtr);
if (!DphRoot) return FALSE;
RtlpDphLeaveCriticalSection(DphRoot);
return TRUE;
}
/* EOF */