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); -- 1.4.4.2