[PATCH 5/5] ntdll: Split heap_validate to heap_validate and heap_validate_ptr.
Rémi Bernon
rbernon at codeweavers.com
Thu Apr 28 05:31:49 CDT 2022
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/ntdll/heap.c | 82 +++++++++++++++++++++++++----------------------
1 file changed, 44 insertions(+), 38 deletions(-)
diff --git a/dlls/ntdll/heap.c b/dlls/ntdll/heap.c
index b84fa8dd42c..020176347e8 100644
--- a/dlls/ntdll/heap.c
+++ b/dlls/ntdll/heap.c
@@ -811,35 +811,41 @@ static BOOL validate_block_pointer( HEAP *heap, SUBHEAP **ret_subheap, const ARE
return ret;
}
-static BOOL heap_validate( HEAP *heapPtr, DWORD flags, LPCVOID block, BOOL quiet )
+static BOOL heap_validate_ptr( HEAP *heap, DWORD flags, const void *ptr, BOOL quiet )
{
+ const ARENA_INUSE *arena = (const ARENA_INUSE *)ptr - 1;
+ const ARENA_LARGE *large_arena;
SUBHEAP *subheap;
BOOL ret = FALSE;
- const ARENA_LARGE *large_arena;
- heap_lock( heapPtr, flags );
+ heap_lock( heap, flags );
- if (block) /* only check this single memory block */
+ if (!(subheap = find_subheap( heap, arena )) ||
+ ((const char *)arena < (char *)subheap->base + subheap->headerSize))
{
- const ARENA_INUSE *arena = (const ARENA_INUSE *)block - 1;
-
- if (!(subheap = find_subheap( heapPtr, arena )) ||
- ((const char *)arena < (char *)subheap->base + subheap->headerSize))
+ if (!(large_arena = find_large_block( heap, ptr )))
{
- if (!(large_arena = find_large_block( heapPtr, block )))
- {
- if (quiet == NOISY)
- ERR("Heap %p: block %p is not inside heap\n", heapPtr, block );
- else if (WARN_ON(heap))
- WARN("Heap %p: block %p is not inside heap\n", heapPtr, block );
- }
- else ret = validate_large_arena( heapPtr, large_arena, quiet );
+ if (quiet == NOISY) ERR("heap %p, ptr %p is not inside heap\n", heap, ptr );
+ else if (WARN_ON(heap)) WARN("heap %p, ptr %p is not inside heap\n", heap, ptr );
}
- else ret = validate_used_block( subheap, arena, quiet );
- goto done;
+ else ret = validate_large_arena( heap, large_arena, quiet );
}
+ else ret = validate_used_block( subheap, arena, quiet );
- LIST_FOR_EACH_ENTRY( subheap, &heapPtr->subheap_list, SUBHEAP, entry )
+ heap_unlock( heap, flags );
+
+ return ret;
+}
+
+static BOOL heap_validate( HEAP *heap, DWORD flags, BOOL quiet )
+{
+ const ARENA_LARGE *large_arena;
+ SUBHEAP *subheap;
+ BOOL ret = FALSE;
+
+ heap_lock( heap, flags );
+
+ LIST_FOR_EACH_ENTRY( subheap, &heap->subheap_list, SUBHEAP, entry )
{
char *ptr = (char *)subheap->base + subheap->headerSize;
while (ptr < (char *)subheap->base + subheap->size)
@@ -857,13 +863,14 @@ static BOOL heap_validate( HEAP *heapPtr, DWORD flags, LPCVOID block, BOOL quiet
}
}
- LIST_FOR_EACH_ENTRY( large_arena, &heapPtr->large_list, ARENA_LARGE, entry )
- if (!validate_large_arena( heapPtr, large_arena, quiet )) goto done;
+ LIST_FOR_EACH_ENTRY( large_arena, &heap->large_list, ARENA_LARGE, entry )
+ if (!validate_large_arena( heap, large_arena, quiet )) goto done;
ret = TRUE;
done:
- heap_unlock( heapPtr, flags );
+ heap_unlock( heap, flags );
+
return ret;
}
@@ -883,7 +890,7 @@ static HEAP *HEAP_GetPtr(
ERR("Invalid heap %p!\n", heap );
return NULL;
}
- if ((heapPtr->flags & HEAP_VALIDATE_ALL) && !heap_validate( heapPtr, 0, NULL, NOISY ))
+ if ((heapPtr->flags & HEAP_VALIDATE_ALL) && !heap_validate( heapPtr, 0, NOISY ))
{
if (TRACE_ON(heap))
{
@@ -2013,23 +2020,22 @@ SIZE_T WINAPI RtlSizeHeap( HANDLE heap, ULONG flags, const void *ptr )
/***********************************************************************
* RtlValidateHeap (NTDLL.@)
- *
- * Determine if a block is a valid allocation from a heap.
- *
- * PARAMS
- * heap [I] Heap that block was allocated from
- * flags [I] HEAP_ flags from "winnt.h"
- * ptr [I] Block to check
- *
- * RETURNS
- * Success: TRUE. The block was allocated from heap.
- * Failure: FALSE, if heap is invalid or ptr was not allocated from it.
*/
-BOOLEAN WINAPI RtlValidateHeap( HANDLE heap, ULONG flags, LPCVOID ptr )
+BOOLEAN WINAPI RtlValidateHeap( HANDLE heap, ULONG flags, const void *ptr )
{
- HEAP *heapPtr = HEAP_GetPtr( heap );
- if (!heapPtr) return FALSE;
- return heap_validate( heapPtr, flags, ptr, QUIET );
+ HEAP *heapPtr;
+ BOOLEAN ret;
+
+ if (!(heapPtr = HEAP_GetPtr( heap )))
+ ret = FALSE;
+ else
+ {
+ if (ptr) ret = heap_validate_ptr( heapPtr, flags, ptr, QUIET );
+ else ret = heap_validate( heapPtr, flags, QUIET );
+ }
+
+ TRACE( "heap %p, flags %#x, ptr %p, return %u\n", heapPtr, flags, ptr, ret );
+ return ret;
}
--
2.35.1
More information about the wine-devel
mailing list