https://git.reactos.org/?p=reactos.git;a=commitdiff;h=9414fb6b5911686289bb7b0a692c62280531cb7d

commit 9414fb6b5911686289bb7b0a692c62280531cb7d
Author:     Timo Kreuzer <timo.kreu...@reactos.org>
AuthorDate: Thu Sep 5 13:17:18 2024 +0300
Commit:     Timo Kreuzer <timo.kreu...@reactos.org>
CommitDate: Sun Sep 8 03:20:52 2024 +0300

    [NTGDI] Prevent NULL pointer dereference in CLIPPING_UpdateGCRegion
    
    This can happen, when the paged pool is full. This will probably cause 
drawing issues, but at least we don't crash (in this place).
---
 win32ss/gdi/ntgdi/cliprgn.c | 27 ++++++++++++++++++++-------
 1 file changed, 20 insertions(+), 7 deletions(-)

diff --git a/win32ss/gdi/ntgdi/cliprgn.c b/win32ss/gdi/ntgdi/cliprgn.c
index 35cb97ca6b7..b347d0d12a6 100644
--- a/win32ss/gdi/ntgdi/cliprgn.c
+++ b/win32ss/gdi/ntgdi/cliprgn.c
@@ -11,6 +11,8 @@
 #define NDEBUG
 #include <debug.h>
 
+DBG_DEFAULT_CHANNEL(GdiClipRgn);
+
 VOID
 FASTCALL
 IntGdiReleaseRaoRgn(PDC pDC)
@@ -776,16 +778,16 @@ CLIPPING_UpdateGCRegion(PDC pDC)
         pDC->prgnAPI = NULL;
     }
 
-    if (pDC->prgnRao)
-        REGION_Delete(pDC->prgnRao);
-
-    pDC->prgnRao = IntSysCreateRectpRgn(0,0,0,0);
-
-    ASSERT(pDC->prgnRao);
-
     if (pDC->dclevel.prgnMeta || pDC->dclevel.prgnClip)
     {
         pDC->prgnAPI = IntSysCreateRectpRgn(0,0,0,0);
+        if (!pDC->prgnAPI)
+        {
+            /* Best we can do here. Better than crashing. */
+            ERR("Failed to allocate prgnAPI! Expect drawing issues!\n");
+            return;
+        }
+
         if (!pDC->dclevel.prgnMeta)
         {
             REGION_bCopy(pDC->prgnAPI,
@@ -804,6 +806,17 @@ CLIPPING_UpdateGCRegion(PDC pDC)
         }
     }
 
+    if (pDC->prgnRao)
+        REGION_Delete(pDC->prgnRao);
+
+    pDC->prgnRao = IntSysCreateRectpRgn(0,0,0,0);
+    if (!pDC->prgnRao)
+    {
+        /* Best we can do here. Better than crashing. */
+        ERR("Failed to allocate prgnRao! Expect drawing issues!\n");
+        return;
+    }
+
     if (pDC->prgnAPI)
     {
         REGION_bIntersectRegion(pDC->prgnRao,

Reply via email to