[PATCH 2/2] uxtheme: Avoid calling application dialog procedures repeatedly.

Zhiyi Zhang wine at gitlab.winehq.org
Tue Jun 28 22:18:55 CDT 2022


From: Zhiyi Zhang <zzhang at codeweavers.com>

Application dialog procedures are called in UXTHEME_DefDlgProc(), then may be called again in
USER_DefDlgProcA/W(). Lotus Approach doesn't expect this and run into infinite recursion.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52586
Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
 dlls/uxtheme/dialog.c       | 21 +++++++++++++++++----
 dlls/uxtheme/tests/system.c |  2 +-
 2 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/dlls/uxtheme/dialog.c b/dlls/uxtheme/dialog.c
index 13943d753bb..a27382af784 100644
--- a/dlls/uxtheme/dialog.c
+++ b/dlls/uxtheme/dialog.c
@@ -131,12 +131,25 @@ LRESULT WINAPI UXTHEME_DefDlgProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp, BOO
         dlgproc = (WNDPROC)GetWindowLongPtrW(hwnd, DWLP_DLGPROC);
         SetWindowLongPtrW(hwnd, DWLP_MSGRESULT, 0);
         lr = LOWORD(CallWindowProcW(dlgproc, hwnd, msg, wp, lp));
-        if (lr)
+        if (lr || !IsWindow(hwnd))
             return GetWindowLongPtrW(hwnd, DWLP_MSGRESULT);
 
         brush = get_dialog_background_brush(hwnd, TRUE);
         if (!brush)
-            break;
+        {
+            /* Copied from DEFDLG_Proc() */
+            brush = (HBRUSH)SendMessageW(hwnd, WM_CTLCOLORDLG, wp, (LPARAM)hwnd);
+            if (!brush)
+                brush = (HBRUSH)DefWindowProcW(hwnd, WM_CTLCOLORDLG, wp, (LPARAM)hwnd);
+            if (brush)
+            {
+                hdc = (HDC)wp;
+                GetClientRect(hwnd, &rect);
+                DPtoLP(hdc, (LPPOINT)&rect, 2);
+                FillRect(hdc, &rect, brush);
+            }
+            return TRUE;
+        }
 
         /* Using FillRect() to draw background could introduce a tiling effect if the destination
          * rectangle is larger than the pattern brush size, which is usually 10x600. This bug is
@@ -157,12 +170,12 @@ LRESULT WINAPI UXTHEME_DefDlgProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp, BOO
     {
         dlgproc = (WNDPROC)GetWindowLongPtrW(hwnd, DWLP_DLGPROC);
         lr = CallWindowProcW(dlgproc, hwnd, msg, wp, lp);
-        if (lr)
+        if (lr || !IsWindow(hwnd))
             return lr;
 
         brush = get_dialog_background_brush(hwnd, FALSE);
         if (!brush)
-            break;
+            return DefWindowProcW(hwnd, msg, wp, lp);
 
         hdc = (HDC)wp;
         SetBkColor(hdc, GetSysColor(COLOR_BTNFACE));
diff --git a/dlls/uxtheme/tests/system.c b/dlls/uxtheme/tests/system.c
index 4301a0f76f2..29fe5ec047d 100644
--- a/dlls/uxtheme/tests/system.c
+++ b/dlls/uxtheme/tests/system.c
@@ -2319,7 +2319,7 @@ static void test_EnableThemeDialogTexture(void)
         sprintf(buffer, "message %#x\n", message_tests[i].msg);
         flush_sequences(sequences, NUM_MSG_SEQUENCES);
         SendMessageW(dialog, message_tests[i].msg, (WPARAM)child_hdc, (LPARAM)child);
-        ok_sequence(sequences, PARENT_SEQ_INDEX, message_tests[i].msg_seq, buffer, TRUE);
+        ok_sequence(sequences, PARENT_SEQ_INDEX, message_tests[i].msg_seq, buffer, FALSE);
     }
     ReleaseDC(child, child_hdc);
     EndDialog(dialog, 0);
-- 
GitLab

https://gitlab.winehq.org/wine/wine/-/merge_requests/335



More information about the wine-devel mailing list