Mike McCormack : kernel: Trying to lock an empty global memory block gives an ERROR_DISCARDED.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jan 9 13:52:42 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 3066397babcaaba3727cb40f375776394d54e932
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=3066397babcaaba3727cb40f375776394d54e932

Author: Mike McCormack <mike at codeweavers.com>
Date:   Mon Jan  9 17:16:32 2006 +0100

kernel: Trying to lock an empty global memory block gives an ERROR_DISCARDED.

---

 dlls/kernel/heap.c       |    6 ++++--
 dlls/kernel/tests/heap.c |    8 ++++++++
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/dlls/kernel/heap.c b/dlls/kernel/heap.c
index ec3c24d..ac3b6b2 100644
--- a/dlls/kernel/heap.c
+++ b/dlls/kernel/heap.c
@@ -413,9 +413,11 @@ LPVOID WINAPI GlobalLock(
         pintern = HANDLE_TO_INTERN(hmem);
         if (pintern->Magic == MAGIC_GLOBAL_USED)
         {
-            if (pintern->LockCount < GLOBAL_LOCK_MAX)
-                pintern->LockCount++;
             palloc = pintern->Pointer;
+            if (!pintern->Pointer)
+                SetLastError(ERROR_DISCARDED);
+            else if (pintern->LockCount < GLOBAL_LOCK_MAX)
+                    pintern->LockCount++;
         }
         else
         {
diff --git a/dlls/kernel/tests/heap.c b/dlls/kernel/tests/heap.c
index e5b1e17..27a51cf 100644
--- a/dlls/kernel/tests/heap.c
+++ b/dlls/kernel/tests/heap.c
@@ -102,4 +102,12 @@ START_TEST(heap)
     gbl = LocalReAlloc(0, 10, LMEM_MOVEABLE);
     ok(gbl == NULL, "local realloc allocated memory\n");
 
+    /* trying to lock empty memory should give an error */
+    gbl = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,0);
+    ok(gbl != NULL, "returned NULL\n");
+    SetLastError(0xdeadbeef);
+    mem = GlobalLock(gbl);
+    ok( GetLastError() == ERROR_DISCARDED, "should return an error\n");
+    ok( mem == NULL, "should return NULL\n");
+    GlobalFree(gbl);
 }




More information about the wine-cvs mailing list