James Hawkins : kernel32: Fix the case where memory is freed twice in GlobalFree.

Alexandre Julliard julliard at winehq.org
Mon Sep 17 07:59:57 CDT 2007


Module: wine
Branch: master
Commit: 40dff81b5ac79f30e07eac6d242bbfbba4ee2c7c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=40dff81b5ac79f30e07eac6d242bbfbba4ee2c7c

Author: James Hawkins <truiken at gmail.com>
Date:   Sun Sep 16 18:28:56 2007 -0500

kernel32: Fix the case where memory is freed twice in GlobalFree.

---

 dlls/kernel32/heap.c       |    6 +++-
 dlls/kernel32/tests/heap.c |   12 +++++++
 dlls/user32/tests/dde.c    |   72 ++++++++++++++-----------------------------
 3 files changed, 41 insertions(+), 49 deletions(-)

diff --git a/dlls/kernel32/heap.c b/dlls/kernel32/heap.c
index 98552ca..005a9fe 100644
--- a/dlls/kernel32/heap.c
+++ b/dlls/kernel32/heap.c
@@ -741,7 +741,11 @@ HGLOBAL WINAPI GlobalFree(HGLOBAL hmem)
         hreturned = 0;
         if(ISPOINTER(hmem)) /* POINTER */
         {
-            if(!HeapFree(GetProcessHeap(), 0, (LPVOID) hmem)) hmem = 0;
+            if(!HeapFree(GetProcessHeap(), 0, (LPVOID) hmem))
+            {
+                SetLastError(ERROR_INVALID_HANDLE);
+                hreturned = hmem;
+            }
         }
         else  /* HANDLE */
         {
diff --git a/dlls/kernel32/tests/heap.c b/dlls/kernel32/tests/heap.c
index a02a8d4..66155ef 100644
--- a/dlls/kernel32/tests/heap.c
+++ b/dlls/kernel32/tests/heap.c
@@ -176,6 +176,18 @@ START_TEST(heap)
         "returned %d with %d (expected ERROR_INVALID_HANDLE)\n",
         res, GetLastError());
 
+    gbl = GlobalAlloc(GMEM_DDESHARE, 100);
+
+    /* first free */
+    mem = GlobalFree(gbl);
+    ok(mem == NULL, "Expected NULL, got %p\n", mem);
+
+    /* invalid free */
+    SetLastError(MAGIC_DEAD);
+    mem = GlobalFree(gbl);
+    ok(mem == gbl, "Expected gbl, got %p\n", mem);
+    ok(GetLastError() == ERROR_INVALID_HANDLE,
+       "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
 
     /* ####################################### */
     /* Local*() functions */
diff --git a/dlls/user32/tests/dde.c b/dlls/user32/tests/dde.c
index 054c686..e51391f 100644
--- a/dlls/user32/tests/dde.c
+++ b/dlls/user32/tests/dde.c
@@ -399,12 +399,9 @@ static void test_FreeDDElParam(void)
     ret = FreeDDElParam(WM_DDE_ADVISE, (LPARAM)hglobal);
     ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
     val = GlobalFree(hglobal);
-    todo_wine
-    {
-        ok(val == hglobal, "Expected hglobal, got %p\n", val);
-        ok(GetLastError() == ERROR_INVALID_HANDLE,
-           "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
-    }
+    ok(val == hglobal, "Expected hglobal, got %p\n", val);
+    ok(GetLastError() == ERROR_INVALID_HANDLE,
+       "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
 
     hglobal = GlobalAlloc(GMEM_DDESHARE, 100);
     ret = FreeDDElParam(WM_DDE_UNADVISE, (LPARAM)hglobal);
@@ -416,23 +413,17 @@ static void test_FreeDDElParam(void)
     ret = FreeDDElParam(WM_DDE_ACK, (LPARAM)hglobal);
     ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
     val = GlobalFree(hglobal);
-    todo_wine
-    {
-        ok(val == hglobal, "Expected hglobal, got %p\n", val);
-        ok(GetLastError() == ERROR_INVALID_HANDLE,
-           "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
-    }
+    ok(val == hglobal, "Expected hglobal, got %p\n", val);
+    ok(GetLastError() == ERROR_INVALID_HANDLE,
+       "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
 
     hglobal = GlobalAlloc(GMEM_DDESHARE, 100);
     ret = FreeDDElParam(WM_DDE_DATA, (LPARAM)hglobal);
     ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
     val = GlobalFree(hglobal);
-    todo_wine
-    {
-        ok(val == hglobal, "Expected hglobal, got %p\n", val);
-        ok(GetLastError() == ERROR_INVALID_HANDLE,
-           "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
-    }
+    ok(val == hglobal, "Expected hglobal, got %p\n", val);
+    ok(GetLastError() == ERROR_INVALID_HANDLE,
+       "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
 
     hglobal = GlobalAlloc(GMEM_DDESHARE, 100);
     ret = FreeDDElParam(WM_DDE_REQUEST, (LPARAM)hglobal);
@@ -444,12 +435,9 @@ static void test_FreeDDElParam(void)
     ret = FreeDDElParam(WM_DDE_POKE, (LPARAM)hglobal);
     ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
     val = GlobalFree(hglobal);
-    todo_wine
-    {
-        ok(val == hglobal, "Expected hglobal, got %p\n", val);
-        ok(GetLastError() == ERROR_INVALID_HANDLE,
-           "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
-    }
+    ok(val == hglobal, "Expected hglobal, got %p\n", val);
+    ok(GetLastError() == ERROR_INVALID_HANDLE,
+       "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
 
     hglobal = GlobalAlloc(GMEM_DDESHARE, 100);
     ret = FreeDDElParam(WM_DDE_EXECUTE, (LPARAM)hglobal);
@@ -519,12 +507,9 @@ static void test_PackDDElParam(void)
     ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
 
     hglobal = GlobalFree((HGLOBAL)lparam);
-    todo_wine
-    {
-        ok(hglobal == (HGLOBAL)lparam, "Expected lparam, got %d\n", ret);
-        ok(GetLastError() == ERROR_INVALID_HANDLE,
-           "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
-    }
+    ok(hglobal == (HGLOBAL)lparam, "Expected lparam, got %d\n", ret);
+    ok(GetLastError() == ERROR_INVALID_HANDLE,
+       "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
 
     lparam = PackDDElParam(WM_DDE_UNADVISE, 0xcafe, 0xbeef);
     ok(lparam == 0xbeefcafe, "Expected 0xbeefcafe, got %08lx\n", lparam);
@@ -564,12 +549,9 @@ static void test_PackDDElParam(void)
     ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
 
     hglobal = GlobalFree((HGLOBAL)lparam);
-    todo_wine
-    {
-        ok(hglobal == (HGLOBAL)lparam, "Expected lparam, got %d\n", ret);
-        ok(GetLastError() == ERROR_INVALID_HANDLE,
-           "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
-    }
+    ok(hglobal == (HGLOBAL)lparam, "Expected lparam, got %d\n", ret);
+    ok(GetLastError() == ERROR_INVALID_HANDLE,
+       "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
 
     lparam = PackDDElParam(WM_DDE_DATA, 0xcafe, 0xbeef);
     ptr = GlobalLock((HGLOBAL)lparam);
@@ -593,12 +575,9 @@ static void test_PackDDElParam(void)
     ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
 
     hglobal = GlobalFree((HGLOBAL)lparam);
-    todo_wine
-    {
-        ok(hglobal == (HGLOBAL)lparam, "Expected lparam, got %d\n", ret);
-        ok(GetLastError() == ERROR_INVALID_HANDLE,
-           "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
-    }
+    ok(hglobal == (HGLOBAL)lparam, "Expected lparam, got %d\n", ret);
+    ok(GetLastError() == ERROR_INVALID_HANDLE,
+       "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
 
     lparam = PackDDElParam(WM_DDE_REQUEST, 0xcafe, 0xbeef);
     ok(lparam == 0xbeefcafe, "Expected 0xbeefcafe, got %08lx\n", lparam);
@@ -638,12 +617,9 @@ static void test_PackDDElParam(void)
     ok(ret == TRUE, "Expected TRUE, got %d\n", ret);
 
     hglobal = GlobalFree((HGLOBAL)lparam);
-    todo_wine
-    {
-        ok(hglobal == (HGLOBAL)lparam, "Expected lparam, got %d\n", ret);
-        ok(GetLastError() == ERROR_INVALID_HANDLE,
-           "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
-    }
+    ok(hglobal == (HGLOBAL)lparam, "Expected lparam, got %d\n", ret);
+    ok(GetLastError() == ERROR_INVALID_HANDLE,
+       "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
 
     lparam = PackDDElParam(WM_DDE_EXECUTE, 0xcafe, 0xbeef);
     ok(lparam == 0xbeef, "Expected 0xbeef, got %08lx\n", lparam);




More information about the wine-cvs mailing list