[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