Module: wine Branch: stable Commit: ca8f2d9e0e46b9cf8bbb2d2da74ed5d843db32cc URL: http://source.winehq.org/git/wine.git/?a=commit;h=ca8f2d9e0e46b9cf8bbb2d2da7...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Tue Aug 16 10:38:32 2016 +0300
user32: Handle invalid dialog handles in IsDialogMessage().
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org (cherry picked from commit 17987c589fc4587b0adfb9de841adf1201efa111) Signed-off-by: Michael Stefaniuc mstefani@winehq.org
---
dlls/user32/dialog.c | 3 +++ dlls/user32/tests/dialog.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+)
diff --git a/dlls/user32/dialog.c b/dlls/user32/dialog.c index 8df38c9..38e4053 100644 --- a/dlls/user32/dialog.c +++ b/dlls/user32/dialog.c @@ -1176,6 +1176,9 @@ BOOL WINAPI IsDialogMessageW( HWND hwndDlg, LPMSG msg ) { INT dlgCode = 0;
+ if (!IsWindow( hwndDlg )) + return FALSE; + if (CallMsgFilterW( msg, MSGF_DIALOGBOX )) return TRUE;
hwndDlg = WIN_GetFullHandle( hwndDlg ); diff --git a/dlls/user32/tests/dialog.c b/dlls/user32/tests/dialog.c index 3488f31..bbe8e47 100644 --- a/dlls/user32/tests/dialog.c +++ b/dlls/user32/tests/dialog.c @@ -719,8 +719,23 @@ static void test_WM_NEXTDLGCTL(void) DestroyWindow(g_hwndTestDlg); }
+static LRESULT CALLBACK hook_proc(INT code, WPARAM wParam, LPARAM lParam) +{ + ok(0, "unexpected hook called, code %d\n", code); + return CallNextHookEx(NULL, code, wParam, lParam); +} + +static BOOL g_MSGF_DIALOGBOX; +static LRESULT CALLBACK hook_proc2(INT code, WPARAM wParam, LPARAM lParam) +{ + ok(code == MSGF_DIALOGBOX, "unexpected hook called, code %d\n", code); + g_MSGF_DIALOGBOX = code == MSGF_DIALOGBOX; + return CallNextHookEx(NULL, code, wParam, lParam); +} + static void test_IsDialogMessage(void) { + HHOOK hook; MSG msg;
g_hwndMain = CreateWindowA("IsDialogMessageWindowClass", "IsDialogMessageWindowClass", @@ -732,11 +747,34 @@ static void test_IsDialogMessage(void) assert (g_hwndButton1); assert (g_hwndButtonCancel);
+ if (0) + { + /* crashes on Windows */ + IsDialogMessageA(NULL, NULL); + IsDialogMessageA(g_hwndMain, NULL); + } + /* The focus should initially be nowhere. The first TAB should take it * to the first button. The second TAB should take it to the Cancel * button. */ + + /* valid window, invalid message window */ + hook = SetWindowsHookExA(WH_MSGFILTER, hook_proc2, NULL, GetCurrentThreadId()); + FormTabMsg (&msg, (HWND)0xbeefbeef); + ok (!IsDialogMessageA(g_hwndMain, &msg), "expected failure\n"); + ok(g_MSGF_DIALOGBOX, "hook wasn't called\n"); + g_MSGF_DIALOGBOX = FALSE; + UnhookWindowsHookEx(hook); + + hook = SetWindowsHookExA(WH_MSGFILTER, hook_proc, NULL, GetCurrentThreadId()); FormTabMsg (&msg, g_hwndMain); + + ok (!IsDialogMessageA(NULL, &msg), "expected failure\n"); + ok (!IsDialogMessageA((HWND)0xbeefbeef, &msg), "expected failure\n"); + + UnhookWindowsHookEx(hook); + ok (IsDialogMessageA(g_hwndMain, &msg), "Did not handle first TAB\n"); ok ((GetFocus() == g_hwndButton1), "Focus did not move to first button\n"); FormTabMsg (&msg, g_hwndButton1); @@ -746,6 +784,18 @@ static void test_IsDialogMessage(void) FormEnterMsg (&msg, g_hwndButtonCancel); ok (IsDialogMessageA(g_hwndMain, &msg), "Did not handle the ENTER\n"); ok (g_terminated, "ENTER did not terminate\n"); + + /* matching but invalid window handles, NULL */ + hook = SetWindowsHookExA(WH_MSGFILTER, hook_proc, NULL, GetCurrentThreadId()); + + FormTabMsg (&msg, NULL); + ok (!IsDialogMessageA(msg.hwnd, &msg), "expected failure\n"); + + /* matching but invalid window handles, not NULL */ + FormTabMsg (&msg, (HWND)0xbeefbeef); + ok (!IsDialogMessageA(msg.hwnd, &msg), "expected failure\n"); + + UnhookWindowsHookEx(hook); }