Fabian Maurer : msvcrt: Don' t crash if _vsnwprintf gets NULL as format string and add test.

Alexandre Julliard julliard at winehq.org
Mon Dec 4 14:58:21 CST 2017


Module: wine
Branch: master
Commit: 058be4304eb0c0e5f264e166b68991808a21001a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=058be4304eb0c0e5f264e166b68991808a21001a

Author: Fabian Maurer <dark.shadow4 at web.de>
Date:   Fri Dec  1 18:19:31 2017 +0100

msvcrt: Don't crash if _vsnwprintf gets NULL as format string and add test.

Signed-off-by: Fabian Maurer <dark.shadow4 at web.de>
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msvcr90/tests/msvcr90.c | 31 +++++++++++++++++++++++++++++++
 dlls/msvcrt/printf.h         |  3 +++
 2 files changed, 34 insertions(+)

diff --git a/dlls/msvcr90/tests/msvcr90.c b/dlls/msvcr90/tests/msvcr90.c
index 0975d00..85dd80b 100644
--- a/dlls/msvcr90/tests/msvcr90.c
+++ b/dlls/msvcr90/tests/msvcr90.c
@@ -133,6 +133,7 @@ static char* (__cdecl *p_setlocale)(int, const char*);
 static int (__cdecl *p__fpieee_flt)(ULONG, EXCEPTION_POINTERS*, int (__cdecl *handler)(_FPIEEE_RECORD*));
 static int (__cdecl *p__memicmp)(const char*, const char*, size_t);
 static int (__cdecl *p__memicmp_l)(const char*, const char*, size_t, _locale_t);
+static int (__cdecl *p__vsnwprintf)(wchar_t *buffer,size_t count, const wchar_t *format, __ms_va_list valist);
 
 /* make sure we use the correct errno */
 #undef errno
@@ -401,6 +402,7 @@ static BOOL init(void)
     SET(p__fpieee_flt, "_fpieee_flt");
     SET(p__memicmp, "_memicmp");
     SET(p__memicmp_l, "_memicmp_l");
+    SET(p__vsnwprintf, "_vsnwprintf");
 
     if (sizeof(void *) == 8)
     {
@@ -1864,6 +1866,34 @@ static void test__memicmp_l(void)
     ok(ret == -1, "got %d\n", ret);
 }
 
+static int WINAPIV _vsnwprintf_wrapper(wchar_t *str, size_t len, const wchar_t *format, ...)
+{
+    int ret;
+    __ms_va_list valist;
+    __ms_va_start(valist, format);
+    ret = p__vsnwprintf(str, len, format, valist);
+    __ms_va_end(valist);
+    return ret;
+}
+
+void test__vsnwprintf(void)
+{
+    int ret;
+    WCHAR str[2] = {0};
+
+    _invalid_parameter_handler old_handler = p_set_invalid_parameter_handler(test_invalid_parameter_handler);
+
+    SET_EXPECT(invalid_parameter_handler);
+    errno = 0xdeadbeef;
+    str[0] = 'x';
+    ret = _vsnwprintf_wrapper(str, 0, NULL);
+    ok(ret == -1, "got %d, expected -1\n", ret);
+    ok(str[0] == 'x', "Expected string to be unchanged.\n");
+    CHECK_CALLED(invalid_parameter_handler, EINVAL);
+
+    ok(p_set_invalid_parameter_handler(old_handler) == test_invalid_parameter_handler, "Cannot reset invalid parameter handler\n");
+}
+
 START_TEST(msvcr90)
 {
     if(!init())
@@ -1897,6 +1927,7 @@ START_TEST(msvcr90)
     test__mbstok_s();
     test__memicmp();
     test__memicmp_l();
+    test__vsnwprintf();
 #ifdef __i386__
     test__fpieee_flt();
 #endif
diff --git a/dlls/msvcrt/printf.h b/dlls/msvcrt/printf.h
index 4ba02ba..ee8120e 100644
--- a/dlls/msvcrt/printf.h
+++ b/dlls/msvcrt/printf.h
@@ -376,6 +376,9 @@ int FUNC_NAME(pf_printf)(FUNC_NAME(puts_clbk) pf_puts, void *puts_ctx, const API
 
     TRACE("Format is: %s\n", FUNC_NAME(debugstr)(fmt));
 
+    if (!MSVCRT_CHECK_PMT(fmt != NULL))
+        return -1;
+
     if(!locale)
         locinfo = get_locinfo();
     else




More information about the wine-cvs mailing list