Module: wine Branch: master Commit: 0984389ca6cd58be02e8a1afd1e051c9cad50b73 URL: https://gitlab.winehq.org/wine/wine/-/commit/0984389ca6cd58be02e8a1afd1e051c...
Author: Rémi Bernon rbernon@codeweavers.com Date: Mon Jul 25 15:43:54 2022 +0200
ntdll: Pass a struct block to (find|validate)_large_block.
---
dlls/ntdll/heap.c | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-)
diff --git a/dlls/ntdll/heap.c b/dlls/ntdll/heap.c index b3c7c7701ec..4d39291bdb8 100644 --- a/dlls/ntdll/heap.c +++ b/dlls/ntdll/heap.c @@ -869,22 +869,22 @@ static struct block *realloc_large_block( struct heap *heap, DWORD flags, struct /*********************************************************************** * find_large_block */ -static ARENA_LARGE *find_large_block( const struct heap *heap, const void *ptr ) +static BOOL find_large_block( const struct heap *heap, const struct block *block ) { ARENA_LARGE *arena;
LIST_FOR_EACH_ENTRY( arena, &heap->large_list, ARENA_LARGE, entry ) - if (ptr == arena + 1) return arena; + if (block == &arena->block) return TRUE;
- return NULL; + return FALSE; }
-static BOOL validate_large_arena( const struct heap *heap, const ARENA_LARGE *arena ) +static BOOL validate_large_block( const struct heap *heap, const struct block *block ) { - const struct block *block = &arena->block; + const ARENA_LARGE *arena = CONTAINING_RECORD( block, ARENA_LARGE, block ); const char *err = NULL;
- if ((ULONG_PTR)arena & COMMIT_MASK) + if (ROUND_ADDR( block, COMMIT_MASK ) != arena) err = "invalid block alignment"; else if (block_get_size( block )) err = "invalid block size"; @@ -1193,21 +1193,20 @@ static BOOL validate_used_block( const struct heap *heap, const SUBHEAP *subheap
static BOOL heap_validate_ptr( const struct heap *heap, const void *ptr, SUBHEAP **subheap ) { - const struct block *arena = (struct block *)ptr - 1; - const ARENA_LARGE *large_arena; + const struct block *block = (struct block *)ptr - 1;
- if (!(*subheap = find_subheap( heap, arena, FALSE ))) + if (!(*subheap = find_subheap( heap, block, FALSE ))) { - if (!(large_arena = find_large_block( heap, ptr ))) + if (!find_large_block( heap, block )) { if (WARN_ON(heap)) WARN("heap %p, ptr %p: block region not found\n", heap, ptr ); return FALSE; }
- return validate_large_arena( heap, large_arena ); + return validate_large_block( heap, block ); }
- return validate_used_block( heap, *subheap, arena ); + return validate_used_block( heap, *subheap, block ); }
static BOOL heap_validate( const struct heap *heap ) @@ -1239,7 +1238,7 @@ static BOOL heap_validate( const struct heap *heap ) }
LIST_FOR_EACH_ENTRY( large_arena, &heap->large_list, ARENA_LARGE, entry ) - if (!validate_large_arena( heap, large_arena )) return FALSE; + if (!validate_large_block( heap, &large_arena->block )) return FALSE;
return TRUE; } @@ -1263,7 +1262,7 @@ static inline struct block *unsafe_block_from_ptr( const struct heap *heap, cons
if (!*subheap) { - if (find_large_block( heap, ptr )) return block; + if (find_large_block( heap, block )) return block; err = "block region not found"; } else if ((ULONG_PTR)ptr % ALIGNMENT) @@ -1860,14 +1859,18 @@ static NTSTATUS heap_walk_blocks( const struct heap *heap, const SUBHEAP *subhea
static NTSTATUS heap_walk( const struct heap *heap, struct rtl_heap_entry *entry ) { - const ARENA_LARGE *large; + const struct block *block = (struct block *)entry->lpData - 1; + const ARENA_LARGE *large = NULL; const struct list *next; const SUBHEAP *subheap; NTSTATUS status; char *base;
- if ((large = find_large_block( heap, entry->lpData ))) + if (find_large_block( heap, block )) + { + large = CONTAINING_RECORD( block, ARENA_LARGE, block ); next = &large->entry; + } else if ((subheap = find_subheap( heap, entry->lpData, TRUE ))) { if (!(status = heap_walk_blocks( heap, subheap, entry ))) return STATUS_SUCCESS;