Piotr Caban : msvcrt: Fix _mbstowcs_s_l return value on truncate.

Alexandre Julliard julliard at winehq.org
Wed Nov 20 16:49:10 CST 2019


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue Nov 19 23:06:29 2019 +0100

msvcrt: Fix _mbstowcs_s_l return value on truncate.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msvcrt/mbcs.c         | 8 +++++---
 dlls/msvcrt/tests/string.c | 5 +++++
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c
index 770ee672af..a9dbcfff66 100644
--- a/dlls/msvcrt/mbcs.c
+++ b/dlls/msvcrt/mbcs.c
@@ -2425,6 +2425,7 @@ int CDECL MSVCRT__mbstowcs_s_l(MSVCRT_size_t *ret, MSVCRT_wchar_t *wcstr,
         MSVCRT_size_t count, MSVCRT__locale_t locale)
 {
     MSVCRT_size_t conv;
+    int err = 0;
 
     if(!wcstr && !size) {
         conv = MSVCRT__mbstowcs_l(NULL, mbstr, 0, locale);
@@ -2447,9 +2448,10 @@ int CDECL MSVCRT__mbstowcs_s_l(MSVCRT_size_t *ret, MSVCRT_wchar_t *wcstr,
     conv = MSVCRT__mbstowcs_l(wcstr, mbstr, conv, locale);
     if(conv<size)
         wcstr[conv++] = '\0';
-    else if(conv==size && (count==MSVCRT__TRUNCATE || wcstr[conv-1]=='\0'))
+    else if(conv==size && count==MSVCRT__TRUNCATE && wcstr[conv-1]!='\0') {
         wcstr[conv-1] = '\0';
-    else {
+        err = MSVCRT_STRUNCATE;
+    }else if(conv==size && wcstr[conv-1]!='\0') {
         MSVCRT_INVALID_PMT("wcstr[size] is too small", MSVCRT_ERANGE);
         if(size)
             wcstr[0] = '\0';
@@ -2458,7 +2460,7 @@ int CDECL MSVCRT__mbstowcs_s_l(MSVCRT_size_t *ret, MSVCRT_wchar_t *wcstr,
 
     if(ret)
         *ret = conv;
-    return 0;
+    return err;
 }
 
 /*********************************************************************
diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c
index 88922fe465..d14c7f009c 100644
--- a/dlls/msvcrt/tests/string.c
+++ b/dlls/msvcrt/tests/string.c
@@ -2080,6 +2080,11 @@ static void test_mbstowcs(void)
         return;
     }
 
+    err = pmbstowcs_s(&ret, wOut, 1, mSimple, _TRUNCATE);
+    ok(err == STRUNCATE, "err = %d\n", err);
+    ok(ret == 1, "mbstowcs_s did not return 0\n");
+    ok(!wOut[0], "wOut[0] = %d\n", wOut[0]);
+
     err = pmbstowcs_s(&ret, wOut, 6, mSimple, _TRUNCATE);
     ok(err == 0, "err = %d\n", err);
     ok(ret == 5, "mbstowcs_s did not return 5\n");




More information about the wine-cvs mailing list