Dmitry Timoshkov : user32: Add exception handler to GetWindowText.

Alexandre Julliard julliard at winehq.org
Mon Nov 22 16:05:18 CST 2021


Module: wine
Branch: master
Commit: ecd1c66476d63ca85c144a814046bdf5b86f4327
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=ecd1c66476d63ca85c144a814046bdf5b86f4327

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Mon Nov 22 10:48:21 2021 +0300

user32: Add exception handler to GetWindowText.

Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/user32/tests/win.c | 29 ++++++++++++++++++++-----
 dlls/user32/win.c       | 57 +++++++++++++++++++++++++++++++++++++------------
 2 files changed, 67 insertions(+), 19 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..4f1f70d9802 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,35 @@ 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 ))
+        {
+            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_PAGE_FAULT
+    {
+        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 +3061,32 @@ 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 ))
+        {
+            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_PAGE_FAULT
+    {
+        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;
 }
 
 




More information about the wine-cvs mailing list