[WIN32K]
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Sat, 21 Aug 2010 19:55:09 +0000 (19:55 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Sat, 21 Aug 2010 19:55:09 +0000 (19:55 +0000)
- Allocate the DCs prgnVis in DC_AllocDC, instead of "on demand" in GdiSelectVisRgn and properly handle failure case. This fixes a possible crash, when running out of gdi handles.

svn path=/trunk/; revision=48579

reactos/subsystems/win32/win32k/objects/cliprgn.c
reactos/subsystems/win32/win32k/objects/dclife.c

index 7bfcf80..4156ba7 100644 (file)
@@ -107,11 +107,7 @@ GdiSelectVisRgn(HDC hdc, HRGN hrgn)
 
   dc->fs &= ~DC_FLAG_DIRTY_RAO;
 
-  if (dc->prgnVis == NULL)
-  {
-    dc->prgnVis = IntSysCreateRectpRgn(0, 0, 0, 0);
-    GDIOBJ_CopyOwnership(hdc, ((PROSRGNDATA)dc->prgnVis)->BaseObject.hHmgr);
-  }
+  ASSERT (dc->prgnVis != NULL);
 
   retval = NtGdiCombineRgn(((PROSRGNDATA)dc->prgnVis)->BaseObject.hHmgr, hrgn, 0, RGN_COPY);
   if ( retval != ERROR )
index 1710dba..af048cd 100644 (file)
@@ -49,6 +49,18 @@ DC_AllocDC(PUNICODE_STRING Driver)
 
     hDC = NewDC->BaseObject.hHmgr;
 
+    /* Allocate a Vis region */
+    NewDC->prgnVis = IntSysCreateRectpRgn(0, 0, 1, 1);
+    if (!NewDC->prgnVis)
+    {
+        DPRINT1("IntSysCreateRectpRgn failed\n");
+        if (!GDIOBJ_FreeObjByHandle(hDC, GDI_OBJECT_TYPE_DC))
+        {
+            ASSERT(FALSE);
+        }
+        return NULL;
+    }
+
     NewDC->pdcattr = &NewDC->dcattr;
     DC_AllocateDcAttr(hDC);
 
@@ -661,7 +673,6 @@ NtGdiCreateCompatibleDC(HDC hDC)
     PDC pdcNew, pdcOld;
     PDC_ATTR pdcattrNew, pdcattrOld;
     HDC hdcNew, DisplayDC = NULL;
-    HRGN hVisRgn;
     UNICODE_STRING DriverName;
     DWORD Layout = 0;
     HSURF hsurf;
@@ -742,12 +753,6 @@ NtGdiCreateCompatibleDC(HDC hDC)
         NtGdiDeleteObjectApp(DisplayDC);
     }
 
-    hVisRgn = IntSysCreateRectRgn(0, 0, 1, 1);
-    if (hVisRgn)
-    {
-        GdiSelectVisRgn(hdcNew, hVisRgn);
-        REGION_FreeRgnByHandle(hVisRgn);
-    }
     if (Layout) NtGdiSetLayout(hdcNew, -1, Layout);
 
     DC_InitDC(hdcNew);