Rémi Bernon : ntdll: Simplify validate_large_arena.

Alexandre Julliard julliard at winehq.org
Mon May 16 15:37:57 CDT 2022


Module: wine
Branch: master
Commit: 6ab02001195609a08fa6aca03223b7ff234d8e46
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=6ab02001195609a08fa6aca03223b7ff234d8e46

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Mon May 16 11:56:04 2022 +0200

ntdll: Simplify validate_large_arena.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/heap.c | 73 +++++++++++++++----------------------------------------
 1 file changed, 19 insertions(+), 54 deletions(-)

diff --git a/dlls/ntdll/heap.c b/dlls/ntdll/heap.c
index 295b215b3b2..504fd3fa743 100644
--- a/dlls/ntdll/heap.c
+++ b/dlls/ntdll/heap.c
@@ -926,66 +926,31 @@ static ARENA_LARGE *find_large_block( const HEAP *heap, const void *ptr )
     return NULL;
 }
 
-
-/***********************************************************************
- *           validate_large_arena
- */
-static BOOL validate_large_arena( const HEAP *heap, const ARENA_LARGE *arena, BOOL quiet )
+static BOOL validate_large_arena( const HEAP *heap, const ARENA_LARGE *arena )
 {
-    DWORD flags = heap->flags;
+    const char *err = NULL;
 
-    if ((ULONG_PTR)arena % page_size)
-    {
-        if (quiet == NOISY)
-        {
-            ERR( "Heap %p: invalid large arena pointer %p\n", heap, arena );
-            if (TRACE_ON(heap)) heap_dump( heap );
-        }
-        else if (WARN_ON(heap))
-        {
-            WARN( "Heap %p: unaligned arena pointer %p\n", heap, arena );
-            if (TRACE_ON(heap)) heap_dump( heap );
-        }
-        return FALSE;
-    }
-    if (arena->size != ARENA_LARGE_SIZE || arena->magic != ARENA_LARGE_MAGIC)
-    {
-        if (quiet == NOISY)
-        {
-            ERR( "Heap %p: invalid large arena %p values %x/%x\n",
-                 heap, arena, arena->size, arena->magic );
-            if (TRACE_ON(heap)) heap_dump( heap );
-        }
-        else if (WARN_ON(heap))
-        {
-            WARN( "Heap %p: invalid large arena %p values %x/%x\n",
-                  heap, arena, arena->size, arena->magic );
-            if (TRACE_ON(heap)) heap_dump( heap );
-        }
-        return FALSE;
-    }
-    if (arena->data_size > arena->block_size - sizeof(*arena))
-    {
-        ERR( "Heap %p: invalid large arena %p size %lx/%lx\n",
-             heap, arena, arena->data_size, arena->block_size );
-        return FALSE;
-    }
-    if (flags & HEAP_TAIL_CHECKING_ENABLED)
+    if ((ULONG_PTR)arena & COMMIT_MASK)
+        err = "invalid block alignment";
+    else if (arena->size != ARENA_LARGE_SIZE || arena->magic != ARENA_LARGE_MAGIC)
+        err = "invalid block header";
+    else if (!contains( arena, arena->block_size, arena + 1, arena->data_size ))
+        err = "invalid block size";
+    else if (heap->flags & HEAP_TAIL_CHECKING_ENABLED)
     {
         SIZE_T i, unused = arena->block_size - sizeof(*arena) - arena->data_size;
         const unsigned char *data = (const unsigned char *)(arena + 1) + arena->data_size;
+        for (i = 0; i < unused && !err; i++) if (data[i] != ARENA_TAIL_FILLER) err = "invalid block tail";
+    }
 
-        for (i = 0; i < unused; i++)
-        {
-            if (data[i] == ARENA_TAIL_FILLER) continue;
-            ERR("Heap %p: block %p tail overwritten at %p (byte %lu/%lu == 0x%02x)\n",
-                heap, arena + 1, data + i, i, unused, data[i] );
-            return FALSE;
-        }
+    if (err)
+    {
+        ERR( "heap %p, block %p: %s\n", heap, arena, err );
+        if (TRACE_ON(heap)) heap_dump( heap );
     }
-    return TRUE;
-}
 
+    return !err;
+}
 
 /***********************************************************************
  *           HEAP_CreateSubHeap
@@ -1451,7 +1416,7 @@ static BOOL heap_validate_ptr( const HEAP *heap, const void *ptr, SUBHEAP **subh
             return FALSE;
         }
 
-        return validate_large_arena( heap, large_arena, QUIET );
+        return validate_large_arena( heap, large_arena );
     }
 
     return HEAP_ValidateInUseArena( *subheap, arena, QUIET );
@@ -1489,7 +1454,7 @@ static BOOL heap_validate( HEAP *heap, BOOL quiet )
     }
 
     LIST_FOR_EACH_ENTRY( large_arena, &heap->large_list, ARENA_LARGE, entry )
-        if (!validate_large_arena( heap, large_arena, quiet )) return FALSE;
+        if (!validate_large_arena( heap, large_arena )) return FALSE;
 
     return TRUE;
 }




More information about the wine-cvs mailing list