[WIN32K:NTUSER]
authorThomas Faber <thomas.faber@reactos.org>
Mon, 12 Jun 2017 19:37:58 +0000 (19:37 +0000)
committerThomas Faber <thomas.faber@reactos.org>
Mon, 12 Jun 2017 19:37:58 +0000 (19:37 +0000)
- Add a hack to avoid doubly freeing a DCE in IntDestroyClass. Since we don't implement W32PF_OWNDCCLEANUP and always free DCEs unconditionally in DceFreeDCE, it is not safe to access the class DCE here (and probably other places) since it could have been deleted by a dying thread.
CORE-13415 #resolve

svn path=/trunk/; revision=75014

reactos/win32ss/user/ntuser/class.c
reactos/win32ss/user/ntuser/dce.h
reactos/win32ss/user/ntuser/windc.c

index e4ac260..d5c1324 100644 (file)
@@ -261,7 +261,7 @@ IntDestroyClass(IN OUT PCLS Class)
 
         if (Class->pdce)
         {
-           DceFreeClassDCE(((PDCE)Class->pdce)->hDC);
+           DceFreeClassDCE(Class->pdce);
            Class->pdce = NULL;
         }
 
index 882385c..3f834c3 100644 (file)
@@ -47,7 +47,7 @@ HWND FASTCALL IntWindowFromDC(HDC hDc);
 void FASTCALL DceFreeDCE(PDCE dce, BOOLEAN Force);
 void FASTCALL DceEmptyCache(void);
 VOID FASTCALL DceResetActiveDCEs(PWND Window);
-void FASTCALL DceFreeClassDCE(HDC);
+void FASTCALL DceFreeClassDCE(PDCE);
 HWND FASTCALL UserGethWnd(HDC,PWNDOBJ*);
 void FASTCALL DceFreeWindowDCE(PWND);
 void FASTCALL DceFreeThreadDCE(PTHREADINFO);
index 1cd4697..e6ad147 100644 (file)
@@ -766,7 +766,7 @@ DceFreeWindowDCE(PWND Window)
 }
 
 void FASTCALL
-DceFreeClassDCE(HDC hDC)
+DceFreeClassDCE(PDCE pdceClass)
 {
    PDCE pDCE;
    PLIST_ENTRY ListEntry;
@@ -776,7 +776,7 @@ DceFreeClassDCE(HDC hDC)
    {
        pDCE = CONTAINING_RECORD(ListEntry, DCE, List);
        ListEntry = ListEntry->Flink;
-       if (pDCE->hDC == hDC)
+       if (pDCE == pdceClass)
        {
           DceFreeDCE(pDCE, TRUE); // Might have gone cheap!
        }