From bb53059226cadb27607d1ffa62d2066d1922e15a Mon Sep 17 00:00:00 2001 From: Daniel Lehman Date: Tue, 30 Jan 2018 12:18:02 -0800 Subject: [PATCH] kernel32: Change error returns from GlobalFree. Signed-off-by: Daniel Lehman --- dlls/kernel32/heap.c | 6 +++--- dlls/kernel32/tests/heap.c | 14 +++++++++++++- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/dlls/kernel32/heap.c b/dlls/kernel32/heap.c index fd6414a..d437f4b 100644 --- a/dlls/kernel32/heap.c +++ b/dlls/kernel32/heap.c @@ -751,7 +751,7 @@ HGLOBAL WINAPI GlobalFree(HGLOBAL hmem) { if(!HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, hmem)) { - SetLastError(ERROR_INVALID_HANDLE); + SetLastError(ERROR_NOACCESS); hreturned = hmem; } } @@ -784,8 +784,8 @@ HGLOBAL WINAPI GlobalFree(HGLOBAL hmem) } __EXCEPT_PAGE_FAULT { - ERR("(%p): Page fault occurred ! Caused by bug ?\n", hmem); - SetLastError( ERROR_INVALID_PARAMETER ); + ERR("invalid handle %p\n", hmem); + SetLastError(ERROR_INVALID_HANDLE); hreturned = hmem; } __ENDTRY diff --git a/dlls/kernel32/tests/heap.c b/dlls/kernel32/tests/heap.c index 67dc8b6..3db826c 100644 --- a/dlls/kernel32/tests/heap.c +++ b/dlls/kernel32/tests/heap.c @@ -208,7 +208,7 @@ static void test_heap(void) ((GetLastError() == ERROR_NOT_LOCKED) || (GetLastError() == MAGIC_DEAD)), "returned %d with %d (expected '0' with: ERROR_NOT_LOCKED or " "MAGIC_DEAD)\n", res, GetLastError()); - + GlobalFree(gbl); /* invalid handles are caught in windows: */ SetLastError(MAGIC_DEAD); @@ -217,6 +217,18 @@ static void test_heap(void) "returned %p with 0x%08x (expected %p with ERROR_INVALID_HANDLE)\n", hsecond, GetLastError(), gbl); SetLastError(MAGIC_DEAD); + hsecond = GlobalFree(LongToHandle(0xdeadbeef)); /* bogus handle */ + ok( (hsecond == LongToHandle(0xdeadbeef)) && (GetLastError() == ERROR_INVALID_HANDLE), + "returned %p with 0x%08x (expected %p with ERROR_INVALID_HANDLE)\n", + hsecond, GetLastError(), LongToHandle(0xdeadbeef)); + SetLastError(MAGIC_DEAD); + hsecond = GlobalFree(LongToHandle(0xdeadbee0)); /* bogus pointer */ + ok( (hsecond == LongToHandle(0xdeadbee0)) && + ((GetLastError() == ERROR_NOACCESS) || broken(GetLastError() == ERROR_INVALID_HANDLE) /* winxp, w2k3 */), + "returned %p with 0x%08x (expected %p with ERROR_NOACCESS)\n", + hsecond, GetLastError(), LongToHandle(0xdeadbee0)); + + SetLastError(MAGIC_DEAD); flags = GlobalFlags(gbl); ok( (flags == GMEM_INVALID_HANDLE) && (GetLastError() == ERROR_INVALID_HANDLE), "returned 0x%04x with 0x%08x (expected GMEM_INVALID_HANDLE with " -- 1.9.5