Piotr Caban : msvcrt: Fix buffer size checks in swscanf_s.

Alexandre Julliard julliard at winehq.org
Sun Mar 18 09:02:31 CDT 2018


Module: wine
Branch: oldstable
Commit: 24c691956459fcbe5007fc00a99c598718f94d5d
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=24c691956459fcbe5007fc00a99c598718f94d5d

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Fri Dec  1 12:29:08 2017 +0100

msvcrt: Fix buffer size checks in swscanf_s.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit 7aa67f1e5f4e0ecafe9fbeec982326c4d78bf883)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>

---

 dlls/msvcrt/scanf.h       |  6 +++---
 dlls/msvcrt/tests/scanf.c | 34 ++++++++++++++++++++++++++++++++++
 2 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/dlls/msvcrt/scanf.h b/dlls/msvcrt/scanf.h
index 2920b9b..cbbcae4 100644
--- a/dlls/msvcrt/scanf.h
+++ b/dlls/msvcrt/scanf.h
@@ -540,7 +540,7 @@ _FUNCTION_ {
                     char *str = suppress ? NULL : va_arg(ap, char*);
                     char *pstr = str;
 #ifdef SECURE
-                    unsigned size = suppress ? UINT_MAX : va_arg(ap, unsigned)/sizeof(char);
+                    unsigned size = suppress ? UINT_MAX : va_arg(ap, unsigned);
 #else
                     unsigned size = UINT_MAX;
 #endif
@@ -566,7 +566,7 @@ _FUNCTION_ {
                     MSVCRT_wchar_t *str = suppress ? NULL : va_arg(ap, MSVCRT_wchar_t*);
                     MSVCRT_wchar_t *pstr = str;
 #ifdef SECURE
-                    unsigned size = suppress ? UINT_MAX : va_arg(ap, unsigned)/sizeof(MSVCRT_wchar_t);
+                    unsigned size = suppress ? UINT_MAX : va_arg(ap, unsigned);
 #else
                     unsigned size = UINT_MAX;
 #endif
@@ -615,7 +615,7 @@ _FUNCTION_ {
                     ULONG *Mask;
 		    int invert = 0; /* Set if we are NOT to find the chars */
 #ifdef SECURE
-                    unsigned size = suppress ? UINT_MAX : va_arg(ap, unsigned)/sizeof(_CHAR_);
+                    unsigned size = suppress ? UINT_MAX : va_arg(ap, unsigned);
 #else
                     unsigned size = UINT_MAX;
 #endif
diff --git a/dlls/msvcrt/tests/scanf.c b/dlls/msvcrt/tests/scanf.c
index 1d1f28e..e3e0efd 100644
--- a/dlls/msvcrt/tests/scanf.c
+++ b/dlls/msvcrt/tests/scanf.c
@@ -324,9 +324,43 @@ static void test_swscanf( void )
     ok(c == 'b', "c = %x\n", c);
 }
 
+static void test_swscanf_s(void)
+{
+    static const wchar_t fmt1[] = {'%','c',0};
+    static const wchar_t fmt2[] = {'%','[','a','-','z',']',0};
+
+    int (WINAPIV *pswscanf_s)(const wchar_t*,const wchar_t*,...);
+    HMODULE hmod = GetModuleHandleA("msvcrt.dll");
+    wchar_t buf[2], out[2];
+    int ret;
+
+    pswscanf_s = (void*)GetProcAddress(hmod, "swscanf_s");
+    if(!pswscanf_s) {
+        win_skip("swscanf_s not available\n");
+        return;
+    }
+
+    buf[0] = 'a';
+    buf[1] = '1';
+    out[1] = 'b';
+    ret = pswscanf_s(buf, fmt1, out, 1);
+    ok(ret == 1, "swscanf_s returned %d\n", ret);
+    ok(out[0] == 'a', "out[0] = %x\n", out[0]);
+    ok(out[1] == 'b', "out[1] = %x\n", out[1]);
+
+    ret = pswscanf_s(buf, fmt2, out, 1);
+    ok(!ret, "swscanf_s returned %d\n", ret);
+
+    ret = pswscanf_s(buf, fmt2, out, 2);
+    ok(ret == 1, "swscanf_s returned %d\n", ret);
+    ok(out[0] == 'a', "out[0] = %x\n", out[0]);
+    ok(!out[1], "out[1] = %x\n", out[1]);
+}
+
 START_TEST(scanf)
 {
     test_sscanf();
     test_sscanf_s();
     test_swscanf();
+    test_swscanf_s();
 }




More information about the wine-cvs mailing list