Piotr Caban : msvcrt: Return error on invalid character in mbstowcs.

Alexandre Julliard julliard at winehq.org
Wed Aug 5 16:05:00 CDT 2020


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Wed Aug  5 15:07:18 2020 +0200

msvcrt: Return error on invalid character in mbstowcs.

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

---

 dlls/msvcrt/mbcs.c         | 15 +++++++++++----
 dlls/msvcrt/tests/string.c |  5 +++++
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c
index a065b8b003..dc52cf1b8c 100644
--- a/dlls/msvcrt/mbcs.c
+++ b/dlls/msvcrt/mbcs.c
@@ -2472,8 +2472,15 @@ MSVCRT_size_t CDECL MSVCRT__mbstowcs_l(MSVCRT_wchar_t *wcstr, const char *mbstr,
     }
 
     /* Ignore count parameter */
-    if(!wcstr)
-        return MultiByteToWideChar(locinfo->lc_codepage, 0, mbstr, -1, NULL, 0)-1;
+    if(!wcstr) {
+        size = MultiByteToWideChar(locinfo->lc_codepage,
+                MB_ERR_INVALID_CHARS, mbstr, -1, NULL, 0);
+        if(!size) {
+            *MSVCRT__errno() = MSVCRT_EILSEQ;
+            return -1;
+        }
+        return size - 1;
+    }
 
     for(i=0, size=0; i<count; i++) {
         if(mbstr[size] == '\0')
@@ -2483,8 +2490,8 @@ MSVCRT_size_t CDECL MSVCRT__mbstowcs_l(MSVCRT_wchar_t *wcstr, const char *mbstr,
     }
 
     if(size) {
-        size = MultiByteToWideChar(locinfo->lc_codepage, 0,
-                                   mbstr, size, wcstr, count);
+        size = MultiByteToWideChar(locinfo->lc_codepage,
+                MB_ERR_INVALID_CHARS, mbstr, size, wcstr, count);
         if(!size) {
             if(count) wcstr[0] = '\0';
             *MSVCRT__errno() = MSVCRT_EILSEQ;
diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c
index 3970f703f6..a4b1fb9d11 100644
--- a/dlls/msvcrt/tests/string.c
+++ b/dlls/msvcrt/tests/string.c
@@ -2107,6 +2107,11 @@ static void test_mbstowcs(void)
     ok(ret == 0, "mbstowcs did not return 0, got %d\n", (int)ret);
     ok(!memcmp(wOut, wEmpty, sizeof(wEmpty)), "wOut = %s\n", wine_dbgstr_w(wOut));
 
+    errno = 0xdeadbeef;
+    ret = mbstowcs(wOut, mHiragana+1, 5);
+    ok(ret == -1, "mbstowcs did not return -1\n");
+    ok(errno == EILSEQ, "errno = %d\n", errno);
+
     ret = wcstombs(mOut, wHiragana, 6);
     ok(ret == 4, "wcstombs did not return 4\n");
     ok(!memcmp(mOut, mHiragana, sizeof(mHiragana)), "mOut = %s\n", mOut);




More information about the wine-cvs mailing list