comctl32: Return the number of characters copied in WM_GETTEXT even if the buffer is too small

Juan Lang juan.lang at gmail.com
Tue Aug 25 18:36:01 CDT 2009


I tested this with native comctl32 locally, but not actually on
Windows.  I hope that's sufficient.

Fixes bugs 19839 and 13411.
--Juan
-------------- next part --------------
From 20662722cda054372827031b326154b61f4ca656 Mon Sep 17 00:00:00 2001
From: Juan Lang <juan.lang at gmail.com>
Date: Tue, 25 Aug 2009 16:24:13 -0700
Subject: [PATCH 3/3] Return the number of characters copied in WM_GETTEXT even if the buffer is too small

---
 dlls/comctl32/status.c       |    9 +++++++--
 dlls/comctl32/tests/status.c |   23 +++++++++++++++++++++++
 2 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/dlls/comctl32/status.c b/dlls/comctl32/status.c
index 11a977d..da08c22 100644
--- a/dlls/comctl32/status.c
+++ b/dlls/comctl32/status.c
@@ -1013,6 +1013,8 @@ STATUSBAR_WMGetText (const STATUS_INFO *infoPtr, INT size, LPWSTR buf)
     TRACE("\n");
     if (!(infoPtr->parts[0].text))
         return 0;
+    else if (size <= 0)
+        return 0;
 
     len = strlenW (infoPtr->parts[0].text);
 
@@ -1020,8 +1022,11 @@ STATUSBAR_WMGetText (const STATUS_INFO *infoPtr, INT size, LPWSTR buf)
         strcpyW (buf, infoPtr->parts[0].text);
 	return len;
     }
-
-    return -1;
+    else {
+        memcpy (buf, infoPtr->parts[0].text, (size - 1) * sizeof(WCHAR));
+        buf[size] = 0;
+        return size - 1;
+    }
 }
 
 
diff --git a/dlls/comctl32/tests/status.c b/dlls/comctl32/tests/status.c
index f1cbda4..2268bf2 100644
--- a/dlls/comctl32/tests/status.c
+++ b/dlls/comctl32/tests/status.c
@@ -466,6 +466,28 @@ static void test_status_ownerdraw(void)
     SetWindowLongPtr( g_hMainWnd, GWLP_WNDPROC, (LONG_PTR)g_wndproc_saved );
 }
 
+static void test_gettext(void)
+{
+    HWND hwndStatus = CreateWindow(SUBCLASS_NAME, NULL, WS_CHILD|WS_VISIBLE,
+        0, 0, 300, 20, g_hMainWnd, NULL, NULL, NULL);
+    char buf[5];
+    int r;
+
+    r = SendMessage(hwndStatus, SB_SETTEXT, 0, (LPARAM)"Text");
+    expect(TRUE, r);
+    r = SendMessage(hwndStatus, WM_GETTEXTLENGTH, 0, 0);
+    expect(4, r);
+    buf[0] = 0xa;
+    /* A size of 1 only stores the NULL terminator */
+    r = SendMessage(hwndStatus, WM_GETTEXT, 1, (LPARAM)buf);
+    expect(0, r);
+    ok(!buf[0], "expected empty buffer\n");
+    r = SendMessage(hwndStatus, WM_GETTEXT, sizeof(buf), (LPARAM)buf);
+    expect(4, r);
+    ok(!strcmp(buf, "Text"), "expected Text, got %s\n", buf);
+    DestroyWindow(hwndStatus);
+}
+
 START_TEST(status)
 {
     hinst = GetModuleHandleA(NULL);
@@ -483,4 +505,5 @@ START_TEST(status)
     test_create();
     test_height();
     test_status_ownerdraw();
+    test_gettext();
 }
-- 
1.6.3.2


More information about the wine-patches mailing list