[WIN32K]
authorThomas Faber <thomas.faber@reactos.org>
Sun, 30 Apr 2017 18:41:56 +0000 (18:41 +0000)
committerThomas Faber <thomas.faber@reactos.org>
Sun, 30 Apr 2017 18:41:56 +0000 (18:41 +0000)
- Check for null members when cleaning up DCs and brushes. Fixes crashes in some failure cases when running out of GDI handles.
CORE-13155

svn path=/trunk/; revision=74435

reactos/win32ss/gdi/eng/engbrush.c
reactos/win32ss/gdi/ntgdi/dclife.c

index 4003b7a..6940a44 100644 (file)
@@ -175,9 +175,18 @@ EBRUSHOBJ_vCleanup(EBRUSHOBJ *pebo)
     }
 
     /* Dereference the palettes */
-    PALETTE_ShareUnlockPalette(pebo->ppalSurf);
-    PALETTE_ShareUnlockPalette(pebo->ppalDC);
-    if (pebo->ppalDIB) PALETTE_ShareUnlockPalette(pebo->ppalDIB);
+    if (pebo->ppalSurf)
+    {
+        PALETTE_ShareUnlockPalette(pebo->ppalSurf);
+    }
+    if (pebo->ppalDC)
+    {
+        PALETTE_ShareUnlockPalette(pebo->ppalDC);
+    }
+    if (pebo->ppalDIB)
+    {
+        PALETTE_ShareUnlockPalette(pebo->ppalDIB);
+    }
 }
 
 VOID
index 647a1b6..d27481c 100644 (file)
@@ -91,7 +91,6 @@ DC_AllocDcWithHandle(GDILOOBJTYPE eDcObjType)
     /* Insert the object */
     if (!GDIOBJ_hInsertObject(&pdc->BaseObject, GDI_OBJ_HMGR_POWNED))
     {
-        /// FIXME: this is broken, since the DC is not initialized yet...
         DPRINT1("Could not insert DC into handle table.\n");
         GDIOBJ_vFreeObject(&pdc->BaseObject);
         return NULL;
@@ -370,7 +369,8 @@ DC_vCleanup(PVOID ObjectBody)
     EBRUSHOBJ_vCleanup(&pdc->eboBackground);
 
     /* Release font */
-    LFONT_ShareUnlockFont(pdc->dclevel.plfnt);
+    if (pdc->dclevel.plfnt)
+        LFONT_ShareUnlockFont(pdc->dclevel.plfnt);
 
     /*  Free regions */
     if (pdc->dclevel.prgnClip)
@@ -394,10 +394,11 @@ DC_vCleanup(PVOID ObjectBody)
        pdc->dclevel.hPath = 0;
        pdc->dclevel.flPath = 0;
     }
-    if(pdc->dclevel.pSurface)
+    if (pdc->dclevel.pSurface)
         SURFACE_ShareUnlockSurface(pdc->dclevel.pSurface);
 
-    PDEVOBJ_vRelease(pdc->ppdev);
+    if (pdc->ppdev)
+        PDEVOBJ_vRelease(pdc->ppdev);
 }
 
 VOID