From 40dff81b5ac79f30e07eac6d242bbfbba4ee2c7c Mon Sep 17 00:00:00 2001 From: James Hawkins Date: Sun, 16 Sep 2007 18:28:56 -0500 Subject: [PATCH] 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 98552ca18ae..005a9fe4d41 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 a02a8d4cb7c..66155ef9f03 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 054c68683f6..e51391fc506 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);