James Hawkins : kernel32: Don' t crash accessing an invalid handle in GlobalSize.
Alexandre Julliard
julliard at winehq.org
Thu Sep 20 10:30:04 CDT 2007
Module: wine
Branch: master
Commit: 8e90c6099eb2db2f7fc2aded317d76888cf1f4dc
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8e90c6099eb2db2f7fc2aded317d76888cf1f4dc
Author: James Hawkins <truiken at gmail.com>
Date: Thu Sep 20 01:49:26 2007 -0500
kernel32: Don't crash accessing an invalid handle in GlobalSize.
---
dlls/kernel32/heap.c | 6 +++++-
dlls/kernel32/tests/heap.c | 7 +++++++
2 files changed, 12 insertions(+), 1 deletions(-)
diff --git a/dlls/kernel32/heap.c b/dlls/kernel32/heap.c
index b526af0..9375a2e 100644
--- a/dlls/kernel32/heap.c
+++ b/dlls/kernel32/heap.c
@@ -807,7 +807,11 @@ SIZE_T WINAPI GlobalSize(HGLOBAL hmem)
DWORD retval;
PGLOBAL32_INTERN pintern;
- if (!hmem) return 0;
+ if (!((ULONG_PTR)hmem >> 16))
+ {
+ SetLastError(ERROR_INVALID_HANDLE);
+ return 0;
+ }
if(ISPOINTER(hmem))
{
diff --git a/dlls/kernel32/tests/heap.c b/dlls/kernel32/tests/heap.c
index 34393e8..2939862 100644
--- a/dlls/kernel32/tests/heap.c
+++ b/dlls/kernel32/tests/heap.c
@@ -197,6 +197,13 @@ START_TEST(heap)
res = GlobalUnlock(gbl);
ok(res == 1, "Expected 1, got %d\n", res);
+ /* GlobalSize on an invalid handle */
+ SetLastError(MAGIC_DEAD);
+ size = GlobalSize((HGLOBAL)0xc042);
+ ok(size == 0, "Expected 0, got %ld\n", size);
+ ok(GetLastError() == ERROR_INVALID_HANDLE,
+ "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError());
+
/* ####################################### */
/* Local*() functions */
gbl = LocalAlloc(LMEM_MOVEABLE, 0);
More information about the wine-cvs
mailing list