Rémi Bernon : ntdll: Use next_block helper in heap_reallocate.

Alexandre Julliard julliard at winehq.org
Tue May 17 15:37:22 CDT 2022


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

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Sun May  1 20:23:27 2022 +0200

ntdll: Use next_block helper in heap_reallocate.

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

---

 dlls/ntdll/heap.c | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/dlls/ntdll/heap.c b/dlls/ntdll/heap.c
index 0142328e978..374b4e1f209 100644
--- a/dlls/ntdll/heap.c
+++ b/dlls/ntdll/heap.c
@@ -1683,7 +1683,7 @@ static NTSTATUS heap_reallocate( HEAP *heap, ULONG flags, void *ptr, SIZE_T size
     oldActualSize = (pArena->size & ARENA_SIZE_MASK) - pArena->unused_bytes;
     if (rounded_size > oldBlockSize)
     {
-        char *pNext = (char *)(pArena + 1) + oldBlockSize;
+        struct block *next;
 
         if (rounded_size >= HEAP_MIN_LARGE_BLOCK_SIZE && (flags & HEAP_GROWABLE))
         {
@@ -1694,14 +1694,14 @@ static NTSTATUS heap_reallocate( HEAP *heap, ULONG flags, void *ptr, SIZE_T size
             HEAP_MakeInUseBlockFree( subheap, pArena );
             return STATUS_SUCCESS;
         }
-        if ((pNext < (char *)subheap->base + subheap->size) &&
-            (*(DWORD *)pNext & ARENA_FLAG_FREE) &&
-            (oldBlockSize + (*(DWORD *)pNext & ARENA_SIZE_MASK) + sizeof(ARENA_FREE) >= rounded_size))
+
+        if ((next = next_block( subheap, pArena )) && (block_get_flags( next ) & ARENA_FLAG_FREE) &&
+            (oldBlockSize + block_get_size( next ) >= rounded_size))
         {
             /* The next block is free and large enough */
-            ARENA_FREE *pFree = (ARENA_FREE *)pNext;
-            list_remove( &pFree->entry );
-            pArena->size += (pFree->size & ARENA_SIZE_MASK) + sizeof(*pFree);
+            struct entry *entry = (struct entry *)next;
+            list_remove( &entry->entry );
+            pArena->size += block_get_size( next );
             if (!HEAP_Commit( subheap, pArena, rounded_size )) return STATUS_NO_MEMORY;
             notify_realloc( pArena + 1, oldActualSize, size );
             HEAP_ShrinkBlock( subheap, pArena, rounded_size );




More information about the wine-cvs mailing list