Akihiro Sagawa : imm32: Correctly return the size of the required output buffer.

Alexandre Julliard julliard at winehq.org
Tue Mar 19 17:09:20 CDT 2019


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

Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date:   Sun Mar 17 23:29:29 2019 +0900

imm32: Correctly return the size of the required output buffer.

This fixes a regression introduced by fd7cda93a33c9f65a6c1d1d530738c9fe4b9edf4.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46851
Signed-off-by: Akihiro Sagawa <sagawa.aki at gmail.com>
Signed-off-by: Aric Stewart <aric at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/imm32/imm.c         |  9 +++++++--
 dlls/imm32/tests/imm32.c | 12 ++++++++++++
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c
index b462141..b2ac662 100644
--- a/dlls/imm32/imm.c
+++ b/dlls/imm32/imm.c
@@ -1224,8 +1224,13 @@ static INT CopyCompStringIMEtoClient(const InputContextData *data, const void *s
     }
     else
     {
-        ret = min(src_len * char_size, dst_len);
-        memcpy(dst, src, ret);
+        if (dst_len)
+        {
+            ret = min(src_len * char_size, dst_len);
+            memcpy(dst, src, ret);
+        }
+        else
+            ret = src_len * char_size;
     }
 
     return ret;
diff --git a/dlls/imm32/tests/imm32.c b/dlls/imm32/tests/imm32.c
index d15fa9c..040a43f 100644
--- a/dlls/imm32/tests/imm32.c
+++ b/dlls/imm32/tests/imm32.c
@@ -473,6 +473,18 @@ static void test_ImmGetCompositionString(void)
         len = ImmGetCompositionStringW(imc, GCS_COMPSTR, wstring, wlen - 1);
         ok(len == wlen - 1, "Unexpected length %d.\n", len);
         ok(!memcmp(wstring, string, wlen - 1), "Unexpected buffer contents.\n");
+
+        /* Get the size of the required output buffer. */
+        memset(wstring, 0x1a, sizeof(wstring));
+        memset(cstring, 0x1a, sizeof(cstring));
+
+        len = ImmGetCompositionStringA(imc, GCS_COMPSTR, cstring, 0);
+        ok(len == alen, "Unexpected length %d.\n", len);
+        ok(cstring[0] == 0x1a, "Unexpected buffer contents %s.\n", cstring);
+
+        len = ImmGetCompositionStringW(imc, GCS_COMPSTR, wstring, 0);
+        ok(len == wlen, "Unexpected length %d.\n", len);
+        ok(wstring[0] == 0x1a1a, "Unexpected buffer contents.\n");
     }
     else
         win_skip("Composition string isn't available\n");




More information about the wine-cvs mailing list