[PATCH v2] user32: Add exception handler to GetWindowText. (Resend).
Dmitry Timoshkov
dmitry at baikal.ru
Mon Nov 22 01:48:21 CST 2021
Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
---
dlls/user32/tests/win.c | 29 ++++++++++++++++----
dlls/user32/win.c | 59 ++++++++++++++++++++++++++++++-----------
2 files changed, 67 insertions(+), 21 deletions(-)
diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c
index 88989f4064b..0156987f529 100644
--- a/dlls/user32/tests/win.c
+++ b/dlls/user32/tests/win.c
@@ -7923,17 +7923,36 @@ static void test_gettext(void)
if (0)
{
r = SendMessageA( hwnd, WM_GETTEXT, 0x10, 0x1000);
- ok( r == 0, "settext should return zero\n");
+ ok( r == 0, "WM_GETTEXT should return zero (%ld)\n", r );
r = SendMessageA( hwnd, WM_GETTEXT, 0x10000, 0);
- ok( r == 0, "settext should return zero (%ld)\n", r);
+ ok( r == 0, "WM_GETTEXT should return zero (%ld)\n", r );
r = SendMessageA( hwnd, WM_GETTEXT, 0xff000000, 0x1000);
- ok( r == 0, "settext should return zero (%ld)\n", r);
+ ok( r == 0, "WM_GETTEXT should return zero (%ld)\n", r );
r = SendMessageA( hwnd, WM_GETTEXT, 0x1000, 0xff000000);
- ok( r == 0, "settext should return zero (%ld)\n", r);
- }
+ ok( r == 0, "WM_GETTEXT should return zero (%ld)\n", r );
+ }
+
+ /* GetWindowText doesn't crash */
+ r = GetWindowTextA( hwnd, (LPSTR)0x10, 0x1000 );
+ ok( r == 0, "GetWindowText should return zero (%ld)\n", r );
+ r = GetWindowTextA( hwnd, (LPSTR)0x10000, 0 );
+ ok( r == 0, "GetWindowText should return zero (%ld)\n", r );
+ r = GetWindowTextA( hwnd, (LPSTR)0xff000000, 0x1000 );
+ ok( r == 0, "GetWindowText should return zero (%ld)\n", r );
+ r = GetWindowTextA( hwnd, (LPSTR)0x1000, 0xff000000 );
+ ok( r == 0, "GetWindowText should return zero (%ld)\n", r );
+
+ r = GetWindowTextW( hwnd, (LPWSTR)0x10, 0x1000 );
+ ok( r == 0, "GetWindowText should return zero (%ld)\n", r );
+ r = GetWindowTextW( hwnd, (LPWSTR)0x10000, 0 );
+ ok( r == 0, "GetWindowText should return zero (%ld)\n", r );
+ r = GetWindowTextW( hwnd, (LPWSTR)0xff000000, 0x1000 );
+ ok( r == 0, "GetWindowText should return zero (%ld)\n", r );
+ r = GetWindowTextW( hwnd, (LPWSTR)0x1000, 0xff000000);
+ ok( r == 0, "GetWindowText should return zero (%ld)\n", r );
DestroyWindow(hwnd);
}
diff --git a/dlls/user32/win.c b/dlls/user32/win.c
index 221607b3169..735478c16e4 100644
--- a/dlls/user32/win.c
+++ b/dlls/user32/win.c
@@ -31,6 +31,7 @@
#include "win.h"
#include "controls.h"
#include "winerror.h"
+#include "wine/exception.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(win);
@@ -2999,22 +3000,34 @@ LONG WINAPI DECLSPEC_HOTPATCH SetWindowLongW(
INT WINAPI GetWindowTextA( HWND hwnd, LPSTR lpString, INT nMaxCount )
{
WCHAR *buffer;
+ int ret = 0;
if (!lpString || nMaxCount <= 0) return 0;
- if (WIN_IsCurrentProcess( hwnd ))
+ __TRY
{
- lpString[0] = 0;
- return (INT)SendMessageA( hwnd, WM_GETTEXT, nMaxCount, (LPARAM)lpString );
+ if (WIN_IsCurrentProcess( hwnd ))
+ {
+ lpString[0] = 0;
+ ret = (INT)SendMessageA( hwnd, WM_GETTEXT, nMaxCount, (LPARAM)lpString );
+ }
+ else if ((buffer = HeapAlloc( GetProcessHeap(), 0, nMaxCount * sizeof(WCHAR) )))
+ {
+ /* when window belongs to other process, don't send a message */
+ get_server_window_text( hwnd, buffer, nMaxCount );
+ if (!WideCharToMultiByte( CP_ACP, 0, buffer, -1, lpString, nMaxCount, NULL, NULL ))
+ lpString[nMaxCount-1] = 0;
+ HeapFree( GetProcessHeap(), 0, buffer );
+ ret = strlen(lpString);
+ }
+ }
+ __EXCEPT_ALL
+ {
+ ret = 0;
}
+ __ENDTRY
- /* when window belongs to other process, don't send a message */
- if (!(buffer = HeapAlloc( GetProcessHeap(), 0, nMaxCount * sizeof(WCHAR) ))) return 0;
- get_server_window_text( hwnd, buffer, nMaxCount );
- if (!WideCharToMultiByte( CP_ACP, 0, buffer, -1, lpString, nMaxCount, NULL, NULL ))
- lpString[nMaxCount-1] = 0;
- HeapFree( GetProcessHeap(), 0, buffer );
- return strlen(lpString);
+ return ret;
}
@@ -3047,17 +3060,31 @@ INT WINAPI InternalGetWindowText(HWND hwnd,LPWSTR lpString,INT nMaxCount )
*/
INT WINAPI GetWindowTextW( HWND hwnd, LPWSTR lpString, INT nMaxCount )
{
+ int ret;
+
if (!lpString || nMaxCount <= 0) return 0;
- if (WIN_IsCurrentProcess( hwnd ))
+ __TRY
{
- lpString[0] = 0;
- return (INT)SendMessageW( hwnd, WM_GETTEXT, nMaxCount, (LPARAM)lpString );
+ if (WIN_IsCurrentProcess( hwnd ))
+ {
+ lpString[0] = 0;
+ ret = (INT)SendMessageW( hwnd, WM_GETTEXT, nMaxCount, (LPARAM)lpString );
+ }
+ else
+ {
+ /* when window belongs to other process, don't send a message */
+ get_server_window_text( hwnd, lpString, nMaxCount );
+ ret = lstrlenW(lpString);
+ }
}
+ __EXCEPT_ALL
+ {
+ ret = 0;
+ }
+ __ENDTRY
- /* when window belongs to other process, don't send a message */
- get_server_window_text( hwnd, lpString, nMaxCount );
- return lstrlenW(lpString);
+ return ret;
}
--
2.33.1
More information about the wine-devel
mailing list