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