Alexandre Julliard : gdi32: Release the GDI lock when calling the DC DeleteObject function.

Alexandre Julliard julliard at winehq.org
Wed Jan 28 08:02:49 CST 2009


Module: wine
Branch: master
Commit: b4255d295df209c1468f199e20a3a1ae75ae9c6a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b4255d295df209c1468f199e20a3a1ae75ae9c6a

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Jan 27 16:15:47 2009 +0100

gdi32: Release the GDI lock when calling the DC DeleteObject function.

---

 dlls/gdi32/gdiobj.c |   19 ++++++++++++-------
 1 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/dlls/gdi32/gdiobj.c b/dlls/gdi32/gdiobj.c
index 906cd2a..7b5981b 100644
--- a/dlls/gdi32/gdiobj.c
+++ b/dlls/gdi32/gdiobj.c
@@ -808,6 +808,7 @@ BOOL WINAPI DeleteObject( HGDIOBJ obj )
 {
       /* Check if object is valid */
 
+    struct hdc_list *hdcs_head;
     GDIOBJHDR * header;
     if (HIWORD(obj)) return FALSE;
 
@@ -821,21 +822,25 @@ BOOL WINAPI DeleteObject( HGDIOBJ obj )
 	return TRUE;
     }
 
-    while (header->hdcs)
+    while ((hdcs_head = header->hdcs) != NULL)
     {
-        DC *dc = get_dc_ptr(header->hdcs->hdc);
-        struct hdc_list *tmp;
+        DC *dc = get_dc_ptr(hdcs_head->hdc);
+
+        header->hdcs = hdcs_head->next;
+        TRACE("hdc %p has interest in %p\n", hdcs_head->hdc, obj);
 
-        TRACE("hdc %p has interest in %p\n", header->hdcs->hdc, obj);
         if(dc)
         {
             if(dc->funcs->pDeleteObject)
+            {
+                GDI_ReleaseObj( obj );  /* release the GDI lock */
                 dc->funcs->pDeleteObject( dc->physDev, obj );
+                header = GDI_GetObjPtr( obj, MAGIC_DONTCARE );  /* and grab it again */
+            }
             release_dc_ptr( dc );
         }
-        tmp = header->hdcs;
-        header->hdcs = header->hdcs->next;
-        HeapFree(GetProcessHeap(), 0, tmp);
+        HeapFree(GetProcessHeap(), 0, hdcs_head);
+        if (!header) return FALSE;
     }
 
     if (header->dwCount)




More information about the wine-cvs mailing list