Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48803 Signed-off-by: Roman Pišl rpisl@seznam.cz --- dlls/comctl32/edit.c | 4 +-- dlls/comctl32/tests/edit.c | 66 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 2 deletions(-)
diff --git a/dlls/comctl32/edit.c b/dlls/comctl32/edit.c index d02d7af7b9..b0c32445b0 100644 --- a/dlls/comctl32/edit.c +++ b/dlls/comctl32/edit.c @@ -406,7 +406,7 @@ static SCRIPT_STRING_ANALYSIS EDIT_UpdateUniscribeData(EDITSTATE *es, HDC dc, IN
static inline INT get_vertical_line_count(EDITSTATE *es) { - INT vlc = (es->format_rect.bottom - es->format_rect.top) / es->line_height; + INT vlc = es->line_height ? (es->format_rect.bottom - es->format_rect.top) / es->line_height : 0; return max(1,vlc); }
@@ -1543,7 +1543,7 @@ static void EDIT_UpdateScrollInfo(EDITSTATE *es) si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE | SIF_DISABLENOSCROLL; si.nMin = 0; si.nMax = es->line_count - 1; - si.nPage = (es->format_rect.bottom - es->format_rect.top) / es->line_height; + si.nPage = es->line_height ? (es->format_rect.bottom - es->format_rect.top) / es->line_height : 0; si.nPos = es->y_offset; TRACE("SB_VERT, nMin=%d, nMax=%d, nPage=%d, nPos=%d\n", si.nMin, si.nMax, si.nPage, si.nPos); diff --git a/dlls/comctl32/tests/edit.c b/dlls/comctl32/tests/edit.c index cec6025077..a32d9dec86 100644 --- a/dlls/comctl32/tests/edit.c +++ b/dlls/comctl32/tests/edit.c @@ -1768,6 +1768,71 @@ static BOOL is_font_installed(const char*name) return ret; }
+static WNDPROC orig_class_proc; + +static LRESULT CALLBACK test_class_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + RECT rect; + LRESULT result, r; + + switch (message) + { + case WM_NCCREATE: + result = CallWindowProcA(orig_class_proc, hwnd, message, wParam, lParam); + + memset(&rect, 0, sizeof(rect)); + SendMessageA(hwnd, EM_GETRECT, 0, (LPARAM)&rect); + ok(!rect.right && !rect.bottom, "Invalid size after NCCREATE: %d x %d\n", rect.right, rect.bottom); + + /* test that messages between WM_NCCREATE and WM_CREATE + don't crash or cause unexpected behavior */ + r = SendMessageA(hwnd, EM_SETSEL, 0, 0); + ok(r == 1, "Returned %x, expected 1.\n", r); + r = SendMessageA(hwnd, WM_SIZE, 0, 0x00100010); + todo_wine ok(r == 1, "Returned %x, expected 1.\n", r); + + return result; + + case WM_CREATE: + /* test that messages between WM_NCCREATE and WM_CREATE + don't crash or cause unexpected behavior */ + r = SendMessageA(hwnd, EM_SETSEL, 0, 0); + ok(r == 1, "Returned %x, expected 1.\n", r); + r = SendMessageA(hwnd, WM_SIZE, 0, 0x00100010); + todo_wine ok(r == 1, "Returned %x, expected 1.\n", r); + + break; + } + + return CallWindowProcA(orig_class_proc, hwnd, message, wParam, lParam); +} + +static void test_initialization(void) +{ + BOOL ret; + ATOM atom; + HWND hwEdit; + WNDCLASSA cls; + + ret = GetClassInfoA(NULL, "Edit", &cls); + ok(ret, "Failed to get class info.\n"); + + orig_class_proc = cls.lpfnWndProc; + cls.lpfnWndProc = test_class_proc; + cls.lpszClassName = "TestClassName"; + + atom = RegisterClassA(&cls); + ok(atom != 0, "Failed to register class.\n"); + + hwEdit = CreateWindowExA(0, (LPCSTR)MAKEINTATOM(atom), "Text Text", + ES_MULTILINE | WS_BORDER | ES_AUTOHSCROLL | ES_AUTOVSCROLL | WS_VSCROLL, + 10, 10, 300, 300, NULL, NULL, hinst, NULL); + ok(hwEdit != NULL, "Failed to create a window.\n"); + + DestroyWindow(hwEdit); + UnregisterClassA((LPCSTR)MAKEINTATOM(atom), hinst); +} + static void test_margins(void) { DWORD old_margins, new_margins; @@ -3393,6 +3458,7 @@ START_TEST(edit) test_edit_control_6(); test_edit_control_limittext(); test_edit_control_scroll(); + test_initialization(); test_margins(); test_margins_font_change(); test_text_position();
Signed-off-by: Roman Pišl rpisl@seznam.cz --- dlls/comctl32/edit.c | 8 ++++++-- dlls/comctl32/tests/edit.c | 4 ++++ 2 files changed, 10 insertions(+), 2 deletions(-)
diff --git a/dlls/comctl32/edit.c b/dlls/comctl32/edit.c index b0c32445b0..4861fd7a9c 100644 --- a/dlls/comctl32/edit.c +++ b/dlls/comctl32/edit.c @@ -1579,8 +1579,12 @@ static BOOL EDIT_EM_LineScroll_internal(EDITSTATE *es, INT dx, INT dy) { INT nyoff; INT x_offset_in_pixels; - INT lines_per_page = (es->format_rect.bottom - es->format_rect.top) / - es->line_height; + INT lines_per_page; + + if (!es->line_height || !es->char_width) + return TRUE; + + lines_per_page = (es->format_rect.bottom - es->format_rect.top) / es->line_height;
if (es->style & ES_MULTILINE) { diff --git a/dlls/comctl32/tests/edit.c b/dlls/comctl32/tests/edit.c index a32d9dec86..a632fc93c9 100644 --- a/dlls/comctl32/tests/edit.c +++ b/dlls/comctl32/tests/edit.c @@ -1790,6 +1790,8 @@ static LRESULT CALLBACK test_class_proc(HWND hwnd, UINT message, WPARAM wParam, ok(r == 1, "Returned %x, expected 1.\n", r); r = SendMessageA(hwnd, WM_SIZE, 0, 0x00100010); todo_wine ok(r == 1, "Returned %x, expected 1.\n", r); + r = SendMessageA(hwnd, EM_LINESCROLL, 1, 1); + ok(r == 1, "Returned %x, expected 1.\n", r);
return result;
@@ -1800,6 +1802,8 @@ static LRESULT CALLBACK test_class_proc(HWND hwnd, UINT message, WPARAM wParam, ok(r == 1, "Returned %x, expected 1.\n", r); r = SendMessageA(hwnd, WM_SIZE, 0, 0x00100010); todo_wine ok(r == 1, "Returned %x, expected 1.\n", r); + r = SendMessageA(hwnd, EM_LINESCROLL, 1, 1); + ok(r == 1, "Returned %x, expected 1.\n", r);
break; }
This is just another message which leads to division by zero that can occur during initialization (and works on Windows), but does not affect any application as I am aware of.
On 4/18/20 2:09 PM, Roman Pišl wrote:
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48803 Signed-off-by: Roman Pišl rpisl@seznam.cz
dlls/comctl32/edit.c | 4 +-- dlls/comctl32/tests/edit.c | 66 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 2 deletions(-)
Hi, Roman.
This looks good, but causes compilation warnings on 32 bit, in tests.
Also I was unable to test linked bug, because application shuts down for me after dismissing two message boxes, second one says that software is outdated, according to google translate from Finish.
Dne 20. 04. 20 v 10:21 Nikolay Sivov napsal(a):
On 4/18/20 2:09 PM, Roman Pišl wrote:
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48803 Signed-off-by: Roman Pišl rpisl@seznam.cz
dlls/comctl32/edit.c | 4 +-- dlls/comctl32/tests/edit.c | 66 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 2 deletions(-)
Hi, Roman.
This looks good, but causes compilation warnings on 32 bit, in tests.
I see.. I will send fixed version.
Also I was unable to test linked bug, because application shuts down for me after dismissing two message boxes, second one says that software is outdated, according to google translate from Finish.
Yes, it's a mess. The application from https://bugs.winehq.org/show_bug.cgi?id=48803 started showing second dialog (old version) after 2020/03. The only way is to set clock 2 months back.
However https://bugs.winehq.org/show_bug.cgi?id=37144 is a duplicate of this (comctl32), downloadable and works out of box so it is also usable to check this.
eBay TL from https://bugs.winehq.org/show_bug.cgi?id=19239 may be used to check the user32 variant that I will also send.