[ros-diffs] [tkreuzer] 56517: [WIN32K] When dereferencing an object without a handle, don't check for the ready-to-die flag

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Sat May 5 21:09:13 UTC 2012


Author: tkreuzer
Date: Sat May  5 21:09:08 2012
New Revision: 56517

URL: http://svn.reactos.org/svn/reactos?rev=56517&view=rev
Log:
[WIN32K]
When dereferencing an object without a handle, don't check for the ready-to-die flag

Modified:
    trunk/reactos/win32ss/gdi/ntgdi/gdiobj.c

Modified: trunk/reactos/win32ss/gdi/ntgdi/gdiobj.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/gdi/ntgdi/gdiobj.c?rev=56517&r1=56516&r2=56517&view=diff
==============================================================================
--- trunk/reactos/win32ss/gdi/ntgdi/gdiobj.c [iso-8859-1] (original)
+++ trunk/reactos/win32ss/gdi/ntgdi/gdiobj.c [iso-8859-1] Sat May  5 21:09:08 2012
@@ -479,6 +479,8 @@
     /* Must not be exclusively locked */
     ASSERT(pobj->cExclusiveLock == 0);
 
+    DBG_LOGEVENT(&pobj->slhLog, EVENT_DEREFERENCE, cRefs);
+
     /* Check if the object has a handle */
     if (GDI_HANDLE_GET_INDEX(pobj->hHmgr))
     {
@@ -492,6 +494,9 @@
         /* Check if we reached 0 and handle bit is not set */
         if (cRefs == 0)
         {
+            /* Make sure it's ok to delete the object */
+            ASSERT(pobj->BaseFlags & BASEFLAG_READY_TO_DIE);
+
             /* Check if the handle was process owned */
             if (gpentHmgr[ulIndex].ObjectOwner.ulObj != GDI_OBJ_HMGR_PUBLIC &&
                 gpentHmgr[ulIndex].ObjectOwner.ulObj != GDI_OBJ_HMGR_NONE)
@@ -504,6 +509,9 @@
 
             /* Push entry to the free list */
             ENTRY_vPushFreeEntry(&gpentHmgr[ulIndex]);
+
+            /* Free the object */
+            GDIOBJ_vFreeObject(pobj);
         }
     }
     else
@@ -511,18 +519,13 @@
         /* Decrement the objects reference count */
         ASSERT(pobj->ulShareCount > 0);
         cRefs = InterlockedDecrement((LONG*)&pobj->ulShareCount);
-    }
-
-    DBG_LOGEVENT(&pobj->slhLog, EVENT_DEREFERENCE, cRefs);
-
-    /* Check if we reached 0 */
-    if (cRefs == 0)
-    {
-        /* Make sure it's ok to delete the object */
-        ASSERT(pobj->BaseFlags & BASEFLAG_READY_TO_DIE);
-
-        /* Free the object */
-        GDIOBJ_vFreeObject(pobj);
+
+        /* Check if we reached 0 */
+        if (cRefs == 0)
+        {
+            /* Free the object */
+            GDIOBJ_vFreeObject(pobj);
+        }
     }
 }
 




More information about the Ros-diffs mailing list