Fix the crash when opening notepad++ v8.4.4 preference dialog before e52e42b.
-- v2: comctl32: Set reference data to zero on failure for GetWindowSubclass(). comctl32: Check reference data pointer before using it. comctl32/tests: Add GetWindowSubclass() tests.
From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/comctl32/tests/subclass.c | 52 +++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-)
diff --git a/dlls/comctl32/tests/subclass.c b/dlls/comctl32/tests/subclass.c index 439d61a83c8..b7b4dd0508d 100644 --- a/dlls/comctl32/tests/subclass.c +++ b/dlls/comctl32/tests/subclass.c @@ -29,6 +29,7 @@ #include "wine/heap.h" #include "wine/test.h"
+static BOOL (WINAPI *pGetWindowSubclass)(HWND, SUBCLASSPROC, UINT_PTR, DWORD_PTR *); static BOOL (WINAPI *pSetWindowSubclass)(HWND, SUBCLASSPROC, UINT_PTR, DWORD_PTR); static BOOL (WINAPI *pRemoveWindowSubclass)(HWND, SUBCLASSPROC, UINT_PTR); static LRESULT (WINAPI *pDefSubclassProc)(HWND, UINT, WPARAM, LPARAM); @@ -311,11 +312,12 @@ static BOOL init_function_pointers(void) */ #define MAKEFUNC_ORD(f, ord) (p##f = (void*)GetProcAddress(hmod, (LPSTR)(ord))) MAKEFUNC_ORD(SetWindowSubclass, 410); + MAKEFUNC_ORD(GetWindowSubclass, 411); MAKEFUNC_ORD(RemoveWindowSubclass, 412); MAKEFUNC_ORD(DefSubclassProc, 413); #undef MAKEFUNC_ORD
- if(!pSetWindowSubclass || !pRemoveWindowSubclass || !pDefSubclassProc) + if(!pSetWindowSubclass || !pGetWindowSubclass || !pRemoveWindowSubclass || !pDefSubclassProc) { win_skip("SetWindowSubclass and friends are not available\n"); return FALSE; @@ -338,6 +340,53 @@ static BOOL init_function_pointers(void) return TRUE; }
+static void test_GetWindowSubclass(void) +{ + DWORD_PTR data; + HWND hwnd; + BOOL ret; + + hwnd = CreateWindowA("TestSubclass", "Test subclass", WS_OVERLAPPEDWINDOW, 100, 100, 200, 200, + 0, 0, 0, NULL); + ok(hwnd != NULL, "CreateWindowA failed, error %ld.\n", GetLastError()); + + ret = pSetWindowSubclass(hwnd, wnd_proc_sub, 2, 7); + ok(ret, "SetWindowSubclass failed.\n"); + + data = 0xdeadbeef; + ret = pGetWindowSubclass(NULL, wnd_proc_sub, 2, &data); + ok(!ret, "GetWindowSubclass succeeded.\n"); + todo_wine + ok(data == 0, "Got unexpected data %#Ix.\n", data); + + data = 0xdeadbeef; + ret = pGetWindowSubclass(hwnd, NULL, 2, &data); + ok(!ret, "GetWindowSubclass succeeded.\n"); + todo_wine + ok(data == 0, "Got unexpected data %#Ix.\n", data); + + data = 0xdeadbeef; + ret = pGetWindowSubclass(hwnd, wnd_proc_sub, 0, &data); + ok(!ret, "GetWindowSubclass succeeded.\n"); + todo_wine + ok(data == 0, "Got unexpected data %#Ix.\n", data); + + /* Crash on Wine */ + if (strcmp(winetest_platform, "wine")) + { + ret = pGetWindowSubclass(hwnd, wnd_proc_sub, 2, NULL); + ok(ret, "GetWindowSubclass failed.\n"); + } + + data = 0xdeadbeef; + ret = pGetWindowSubclass(hwnd, wnd_proc_sub, 2, &data); + ok(ret, "GetWindowSubclass failed.\n"); + ok(data == 7, "Got unexpected data %#Ix.\n", data); + + pRemoveWindowSubclass(hwnd, wnd_proc_sub, 2); + DestroyWindow(hwnd); +} + START_TEST(subclass) { if(!init_function_pointers()) return; @@ -345,4 +394,5 @@ START_TEST(subclass) if(!register_window_classes()) return;
test_subclass(); + test_GetWindowSubclass(); }
From: Zhiyi Zhang zzhang@codeweavers.com
Fix the crash when opening notepad++ v8.4.4 preference dialog before e52e42b. --- dlls/comctl32/commctrl.c | 3 ++- dlls/comctl32/tests/subclass.c | 4 ---- 2 files changed, 2 insertions(+), 5 deletions(-)
diff --git a/dlls/comctl32/commctrl.c b/dlls/comctl32/commctrl.c index 57863928fc7..14b148d591d 100644 --- a/dlls/comctl32/commctrl.c +++ b/dlls/comctl32/commctrl.c @@ -1179,7 +1179,8 @@ BOOL WINAPI GetWindowSubclass (HWND hWnd, SUBCLASSPROC pfnSubclass, while (proc) { if ((proc->id == uID) && (proc->subproc == pfnSubclass)) { - *pdwRef = proc->ref; + if (pdwRef) + *pdwRef = proc->ref; return TRUE; } proc = proc->next; diff --git a/dlls/comctl32/tests/subclass.c b/dlls/comctl32/tests/subclass.c index b7b4dd0508d..9f1955c4258 100644 --- a/dlls/comctl32/tests/subclass.c +++ b/dlls/comctl32/tests/subclass.c @@ -371,12 +371,8 @@ static void test_GetWindowSubclass(void) todo_wine ok(data == 0, "Got unexpected data %#Ix.\n", data);
- /* Crash on Wine */ - if (strcmp(winetest_platform, "wine")) - { ret = pGetWindowSubclass(hwnd, wnd_proc_sub, 2, NULL); ok(ret, "GetWindowSubclass failed.\n"); - }
data = 0xdeadbeef; ret = pGetWindowSubclass(hwnd, wnd_proc_sub, 2, &data);
From: Zhiyi Zhang zzhang@codeweavers.com
--- dlls/comctl32/commctrl.c | 5 ++++- dlls/comctl32/tests/subclass.c | 3 --- 2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/dlls/comctl32/commctrl.c b/dlls/comctl32/commctrl.c index 14b148d591d..c5910b40869 100644 --- a/dlls/comctl32/commctrl.c +++ b/dlls/comctl32/commctrl.c @@ -1173,7 +1173,7 @@ BOOL WINAPI GetWindowSubclass (HWND hWnd, SUBCLASSPROC pfnSubclass, /* See if we have been called for this window */ stack = GetPropW (hWnd, COMCTL32_wSubclass); if (!stack) - return FALSE; + goto done;
proc = stack->SubclassProcs; while (proc) { @@ -1186,6 +1186,9 @@ BOOL WINAPI GetWindowSubclass (HWND hWnd, SUBCLASSPROC pfnSubclass, proc = proc->next; }
+done: + if (pdwRef) + *pdwRef = 0; return FALSE; }
diff --git a/dlls/comctl32/tests/subclass.c b/dlls/comctl32/tests/subclass.c index 9f1955c4258..e2e8573f4c0 100644 --- a/dlls/comctl32/tests/subclass.c +++ b/dlls/comctl32/tests/subclass.c @@ -356,19 +356,16 @@ static void test_GetWindowSubclass(void) data = 0xdeadbeef; ret = pGetWindowSubclass(NULL, wnd_proc_sub, 2, &data); ok(!ret, "GetWindowSubclass succeeded.\n"); - todo_wine ok(data == 0, "Got unexpected data %#Ix.\n", data);
data = 0xdeadbeef; ret = pGetWindowSubclass(hwnd, NULL, 2, &data); ok(!ret, "GetWindowSubclass succeeded.\n"); - todo_wine ok(data == 0, "Got unexpected data %#Ix.\n", data);
data = 0xdeadbeef; ret = pGetWindowSubclass(hwnd, wnd_proc_sub, 0, &data); ok(!ret, "GetWindowSubclass succeeded.\n"); - todo_wine ok(data == 0, "Got unexpected data %#Ix.\n", data);
ret = pGetWindowSubclass(hwnd, wnd_proc_sub, 2, NULL);
This merge request was approved by Nikolay Sivov.