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