[RFC PATCH 01/11] kernel32: Catch page faults in GlobalSize.
Rémi Bernon
rbernon at codeweavers.com
Wed May 6 07:09:53 CDT 2020
In the same way GlobalFree does already.
---
dlls/kernel32/heap.c | 78 +++++++++++++++++++++++++-------------------
1 file changed, 44 insertions(+), 34 deletions(-)
diff --git a/dlls/kernel32/heap.c b/dlls/kernel32/heap.c
index 6c5219b624f9..08139db4be98 100644
--- a/dlls/kernel32/heap.c
+++ b/dlls/kernel32/heap.c
@@ -329,41 +329,51 @@ SIZE_T WINAPI GlobalSize(HGLOBAL hmem)
return 0;
}
- if(ISPOINTER(hmem))
- {
- retval=HeapSize(GetProcessHeap(), 0, hmem);
-
- if (retval == ~0ul) /* It might be a GMEM_MOVEABLE data pointer */
- {
- retval = HeapSize(GetProcessHeap(), 0, (char*)hmem - HGLOBAL_STORAGE);
- if (retval != ~0ul) retval -= HGLOBAL_STORAGE;
- }
- }
- else
- {
- RtlLockHeap(GetProcessHeap());
- pintern=HANDLE_TO_INTERN(hmem);
+ RtlLockHeap(GetProcessHeap());
+ __TRY
+ {
+ if(ISPOINTER(hmem))
+ {
+ retval=HeapSize(GetProcessHeap(), 0, hmem);
+
+ if (retval == ~0ul) /* It might be a GMEM_MOVEABLE data pointer */
+ {
+ retval = HeapSize(GetProcessHeap(), 0, (char*)hmem - HGLOBAL_STORAGE);
+ if (retval != ~0ul) retval -= HGLOBAL_STORAGE;
+ }
+ }
+ else
+ {
+ pintern=HANDLE_TO_INTERN(hmem);
+
+ if(pintern->Magic==MAGIC_GLOBAL_USED)
+ {
+ if (!pintern->Pointer) /* handle case of GlobalAlloc( ??,0) */
+ retval = 0;
+ else
+ {
+ retval = HeapSize(GetProcessHeap(), 0, (char *)pintern->Pointer - HGLOBAL_STORAGE );
+ if (retval != ~0ul) retval -= HGLOBAL_STORAGE;
+ }
+ }
+ else
+ {
+ WARN("invalid handle %p (Magic: 0x%04x)\n", hmem, pintern->Magic);
+ SetLastError(ERROR_INVALID_HANDLE);
+ retval=0;
+ }
+ }
+ }
+ __EXCEPT_PAGE_FAULT
+ {
+ SetLastError( ERROR_INVALID_HANDLE );
+ retval = 0;
+ }
+ __ENDTRY
+ RtlUnlockHeap(GetProcessHeap());
- if(pintern->Magic==MAGIC_GLOBAL_USED)
- {
- if (!pintern->Pointer) /* handle case of GlobalAlloc( ??,0) */
- retval = 0;
- else
- {
- retval = HeapSize(GetProcessHeap(), 0, (char *)pintern->Pointer - HGLOBAL_STORAGE );
- if (retval != ~0ul) retval -= HGLOBAL_STORAGE;
- }
- }
- else
- {
- WARN("invalid handle %p (Magic: 0x%04x)\n", hmem, pintern->Magic);
- SetLastError(ERROR_INVALID_HANDLE);
- retval=0;
- }
- RtlUnlockHeap(GetProcessHeap());
- }
- if (retval == ~0ul) retval = 0;
- return retval;
+ if (retval == ~0ul) retval = 0;
+ return retval;
}
--
2.26.1
More information about the wine-devel
mailing list