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