Module: wine Branch: master Commit: ee72b0fdc7ada3a9f83650bd5db996b14ac98c4d URL: http://source.winehq.org/git/wine.git/?a=commit;h=ee72b0fdc7ada3a9f83650bd5d...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Thu Jul 23 22:30:41 2015 +0300
user32: Initialize buffer before sending WM_GETTEXT.
---
dlls/user32/tests/win.c | 123 +++++++++++++++++++++++++++++++++++++++++++++++- dlls/user32/win.c | 8 ++++ 2 files changed, 130 insertions(+), 1 deletion(-)
diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c index 689f0a2..309b699 100644 --- a/dlls/user32/tests/win.c +++ b/dlls/user32/tests/win.c @@ -717,6 +717,14 @@ static void test_enum_thread_windows(void) CloseHandle( handle ); }
+static struct wm_gettext_override_data +{ + BOOL enabled; /* when 1 bypasses default procedure */ + char *buff; /* expected text buffer pointer */ + WCHAR *buffW; /* same, for W test */ + int len; +} g_wm_gettext_override; + static LRESULT WINAPI main_window_procA(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { switch (msg) @@ -798,6 +806,14 @@ static LRESULT WINAPI main_window_procA(HWND hwnd, UINT msg, WPARAM wparam, LPAR break; case WM_GETTEXT: num_gettext_msgs++; + if (g_wm_gettext_override.enabled) + { + char *text = (char*)lparam; + ok(g_wm_gettext_override.buff == text, "expected buffer %p, got %p\n", g_wm_gettext_override.buff, text); + if (g_wm_gettext_override.len) + ok(*text == 0, "expected empty string buffer %x\n", *text); + return 0; + } break; case WM_SETTEXT: num_settext_msgs++; @@ -807,6 +823,26 @@ static LRESULT WINAPI main_window_procA(HWND hwnd, UINT msg, WPARAM wparam, LPAR return DefWindowProcA(hwnd, msg, wparam, lparam); }
+static LRESULT WINAPI main_window_procW(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) +{ + switch (msg) + { + case WM_GETTEXT: + num_gettext_msgs++; + if (g_wm_gettext_override.enabled) + { + WCHAR *text = (WCHAR*)lparam; + ok(g_wm_gettext_override.buffW == text, "expected buffer %p, got %p\n", g_wm_gettext_override.buffW, text); + if (g_wm_gettext_override.len) + ok(*text == 0, "expected empty string buffer %x\n", *text); + return 0; + } + break; + } + + return DefWindowProcA(hwnd, msg, wparam, lparam); +} + static LRESULT WINAPI tool_window_procA(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { switch (msg) @@ -832,8 +868,11 @@ static LRESULT WINAPI tool_window_procA(HWND hwnd, UINT msg, WPARAM wparam, LPAR return DefWindowProcA(hwnd, msg, wparam, lparam); }
+static const WCHAR mainclassW[] = {'M','a','i','n','W','i','n','d','o','w','C','l','a','s','s','W',0}; + static BOOL RegisterWindowClasses(void) { + WNDCLASSW clsW; WNDCLASSA cls;
cls.style = CS_DBLCLKS; @@ -849,6 +888,19 @@ static BOOL RegisterWindowClasses(void)
if(!RegisterClassA(&cls)) return FALSE;
+ clsW.style = CS_DBLCLKS; + clsW.lpfnWndProc = main_window_procW; + clsW.cbClsExtra = 0; + clsW.cbWndExtra = 0; + clsW.hInstance = GetModuleHandleA(0); + clsW.hIcon = 0; + clsW.hCursor = LoadCursorA(0, (LPCSTR)IDC_ARROW); + clsW.hbrBackground = GetStockObject(WHITE_BRUSH); + clsW.lpszMenuName = NULL; + clsW.lpszClassName = mainclassW; + + if(!RegisterClassW(&clsW)) return FALSE; + cls.style = 0; cls.lpfnWndProc = tool_window_procA; cls.cbClsExtra = 0; @@ -5726,11 +5778,12 @@ static DWORD CALLBACK settext_msg_thread( LPVOID arg ) static void test_gettext(void) { DWORD tid, num_msgs; + WCHAR bufW[32]; HANDLE thread; BOOL success; char buf[32]; INT buf_len; - HWND hwnd; + HWND hwnd, hwnd2; LRESULT r; MSG msg;
@@ -5745,6 +5798,74 @@ static void test_gettext(void) ok( !strcmp(buf, "caption"), "got wrong window text '%s'\n", buf ); ok( num_gettext_msgs == 1, "got %u WM_GETTEXT messages\n", num_gettext_msgs );
+ /* other process window */ + strcpy( buf, "a" ); + buf_len = GetWindowTextA( GetDesktopWindow(), buf, sizeof(buf) ); + ok( buf_len == 0, "expected a nonempty window text\n" ); + ok( *buf == 0, "got wrong window text '%s'\n", buf ); + + strcpy( buf, "blah" ); + buf_len = GetWindowTextA( GetDesktopWindow(), buf, 0 ); + ok( buf_len == 0, "expected a nonempty window text\n" ); + ok( !strcmp(buf, "blah"), "got wrong window text '%s'\n", buf ); + + bufW[0] = 0xcc; + buf_len = GetWindowTextW( GetDesktopWindow(), bufW, 0 ); + ok( buf_len == 0, "expected a nonempty window text\n" ); + ok( bufW[0] == 0xcc, "got %x\n", bufW[0] ); + + g_wm_gettext_override.enabled = TRUE; + + num_gettext_msgs = 0; + memset( buf, 0xcc, sizeof(buf) ); + g_wm_gettext_override.buff = buf; + g_wm_gettext_override.len = sizeof(buf); + buf_len = GetWindowTextA( hwnd, buf, sizeof(buf) ); + ok( buf_len == 0, "got %d\n", buf_len ); + ok( *buf == 0, "got %x\n", *buf ); + ok( num_gettext_msgs == 1, "got %u WM_GETTEXT messages\n", num_gettext_msgs ); + + num_gettext_msgs = 0; + strcpy( buf, "blah" ); + g_wm_gettext_override.buff = buf; + g_wm_gettext_override.len = 0; + buf_len = GetWindowTextA( hwnd, buf, 0 ); + ok( buf_len == 0, "got %d\n", buf_len ); + ok( !strcmp(buf, "blah"), "got %s\n", buf ); +todo_wine + ok( num_gettext_msgs == 0, "got %u WM_GETTEXT messages\n", num_gettext_msgs ); + + g_wm_gettext_override.enabled = FALSE; + + /* same for W window */ + hwnd2 = CreateWindowExW( 0, mainclassW, NULL, WS_POPUP, 0, 0, 0, 0, 0, 0, 0, NULL ); + ok( hwnd2 != 0, "CreateWindowExA error %d\n", GetLastError() ); + + g_wm_gettext_override.enabled = TRUE; + + num_gettext_msgs = 0; + memset( bufW, 0xcc, sizeof(bufW) ); + g_wm_gettext_override.buffW = bufW; + g_wm_gettext_override.len = sizeof(bufW)/sizeof(WCHAR); + buf_len = GetWindowTextW( hwnd2, bufW, sizeof(bufW)/sizeof(WCHAR) ); + ok( buf_len == 0, "got %d\n", buf_len ); + ok( *bufW == 0, "got %x\n", *bufW ); + ok( num_gettext_msgs == 1, "got %u WM_GETTEXT messages\n", num_gettext_msgs ); + + num_gettext_msgs = 0; + memset( bufW, 0xcc, sizeof(bufW) ); + g_wm_gettext_override.buffW = bufW; + g_wm_gettext_override.len = 0; + buf_len = GetWindowTextW( hwnd2, bufW, 0 ); + ok( buf_len == 0, "got %d\n", buf_len ); + ok( *bufW == 0xcccc, "got %x\n", *bufW ); +todo_wine + ok( num_gettext_msgs == 0, "got %u WM_GETTEXT messages\n", num_gettext_msgs ); + + g_wm_gettext_override.enabled = FALSE; + + DestroyWindow( hwnd2 ); + /* test WM_GETTEXT */ num_gettext_msgs = 0; memset( buf, 0, sizeof(buf) ); diff --git a/dlls/user32/win.c b/dlls/user32/win.c index 7a3f484..91f1871 100644 --- a/dlls/user32/win.c +++ b/dlls/user32/win.c @@ -2679,7 +2679,11 @@ INT WINAPI GetWindowTextA( HWND hwnd, LPSTR lpString, INT nMaxCount ) if (!lpString) return 0;
if (WIN_IsCurrentProcess( hwnd )) + { + if (nMaxCount > 0) + lpString[0] = 0; return (INT)SendMessageA( hwnd, WM_GETTEXT, nMaxCount, (LPARAM)lpString ); + }
/* when window belongs to other process, don't send a message */ if (nMaxCount <= 0) return 0; @@ -2724,7 +2728,11 @@ INT WINAPI GetWindowTextW( HWND hwnd, LPWSTR lpString, INT nMaxCount ) if (!lpString) return 0;
if (WIN_IsCurrentProcess( hwnd )) + { + if (nMaxCount > 0) + lpString[0] = 0; return (INT)SendMessageW( hwnd, WM_GETTEXT, nMaxCount, (LPARAM)lpString ); + }
/* when window belongs to other process, don't send a message */ if (nMaxCount <= 0) return 0;