Module: wine Branch: refs/heads/master Commit: 9cc41d278ff1d0bebe034ca64d82388751e4aeb6 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=9cc41d278ff1d0bebe034ca6...
Author: Robert Shearman rob@codeweavers.com Date: Thu Jan 12 11:55:25 2006 +0100
kernel32: Fix GlobalReAlloc for size = 0. GlobalReAlloc should return NULL if the requested size is 0, the block is moveable and it is locked, but otherwise it should return the original memory block.
---
dlls/kernel/heap.c | 12 +++++++++--- dlls/kernel/tests/heap.c | 14 ++++---------- 2 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/dlls/kernel/heap.c b/dlls/kernel/heap.c index 6c0b913..19d4b5b 100644 --- a/dlls/kernel/heap.c +++ b/dlls/kernel/heap.c @@ -657,11 +657,17 @@ HGLOBAL WINAPI GlobalReAlloc( } else { - if(pintern->Pointer) + if (pintern->LockCount == 0) { - HeapFree(GetProcessHeap(), 0, (char *) pintern->Pointer-HGLOBAL_STORAGE); - pintern->Pointer=NULL; + if(pintern->Pointer) + { + HeapFree(GetProcessHeap(), 0, (char *) pintern->Pointer-HGLOBAL_STORAGE); + pintern->Pointer = NULL; + } + hnew = hmem; } + else + WARN("not freeing memory associated with locked handle\n"); } } } diff --git a/dlls/kernel/tests/heap.c b/dlls/kernel/tests/heap.c index 27a51cf..a6284a0 100644 --- a/dlls/kernel/tests/heap.c +++ b/dlls/kernel/tests/heap.c @@ -63,11 +63,8 @@ START_TEST(heap) size = GlobalSize(gbl); ok(size >= 10 && size <= 16, "Memory not resized to size 10, instead size=%ld\n", size);
- todo_wine - { - gbl = GlobalReAlloc(gbl, 0, GMEM_MOVEABLE); - ok(gbl != NULL, "GlobalReAlloc should not fail on size 0\n"); - } + gbl = GlobalReAlloc(gbl, 0, GMEM_MOVEABLE); + ok(gbl != NULL, "GlobalReAlloc should not fail on size 0\n");
size = GlobalSize(gbl); ok(size == 0, "Memory not resized to size 0, instead size=%ld\n", size); @@ -87,11 +84,8 @@ START_TEST(heap) size = LocalSize(gbl); ok(size >= 10 && size <= 16, "Memory not resized to size 10, instead size=%ld\n", size);
- todo_wine - { - gbl = LocalReAlloc(gbl, 0, LMEM_MOVEABLE); - ok(gbl != NULL, "LocalReAlloc should not fail on size 0\n"); - } + gbl = LocalReAlloc(gbl, 0, LMEM_MOVEABLE); + ok(gbl != NULL, "LocalReAlloc should not fail on size 0\n");
size = LocalSize(gbl); ok(size == 0, "Memory not resized to size 0, instead size=%ld\n", size);