[PATCH 02/14] [Msvcrt*]: now using the macros for parameter checking for wcsncat_s (and fixed the test)

Eric Pouech eric.pouech at orange.fr
Tue Nov 2 16:02:46 CDT 2010




A+
---

 dlls/msvcrt/tests/string.c |   21 +++++++++++++++++++++
 dlls/msvcrt/wcs.c          |   13 +++++++++----
 2 files changed, 30 insertions(+), 4 deletions(-)


diff --git a/dlls/msvcrt/tests/string.c b/dlls/msvcrt/tests/string.c
index d20257d..f861119 100644
--- a/dlls/msvcrt/tests/string.c
+++ b/dlls/msvcrt/tests/string.c
@@ -1511,20 +1511,35 @@ static void test_wcsncat_s(void)
         return;
     }
 
+    if (p_set_invalid_parameter_handler)
+        ok(p_set_invalid_parameter_handler(test_invalid_parameter_handler) == NULL,
+                "Invalid parameter handler was already set\n");
+
     memcpy(src, abcW, sizeof(abcW));
     dst[0] = 0;
+    SET_EXPECT(invalid_parameter_handler);
     ret = p_wcsncat_s(NULL, 4, src, 4);
     ok(ret == EINVAL, "err = %d\n", ret);
+    CHECK_CALLED(invalid_parameter_handler);
+
+    SET_EXPECT(invalid_parameter_handler);
     ret = p_wcsncat_s(dst, 0, src, 4);
     ok(ret == EINVAL, "err = %d\n", ret);
+    CHECK_CALLED(invalid_parameter_handler);
+
+    SET_EXPECT(invalid_parameter_handler);
     ret = p_wcsncat_s(dst, 0, src, _TRUNCATE);
     ok(ret == EINVAL, "err = %d\n", ret);
+    CHECK_CALLED(invalid_parameter_handler);
+
     ret = p_wcsncat_s(dst, 4, NULL, 0);
     ok(ret == 0, "err = %d\n", ret);
 
     dst[0] = 0;
+    SET_EXPECT(invalid_parameter_handler);
     ret = p_wcsncat_s(dst, 2, src, 4);
     ok(ret == ERANGE, "err = %d\n", ret);
+    CHECK_CALLED(invalid_parameter_handler);
 
     dst[0] = 0;
     ret = p_wcsncat_s(dst, 2, src, _TRUNCATE);
@@ -1533,8 +1548,14 @@ static void test_wcsncat_s(void)
 
     memcpy(dst, abcW, sizeof(abcW));
     dst[3] = 'd';
+    SET_EXPECT(invalid_parameter_handler);
     ret = p_wcsncat_s(dst, 4, src, 4);
     ok(ret == EINVAL, "err = %d\n", ret);
+    CHECK_CALLED(invalid_parameter_handler);
+
+    if (p_set_invalid_parameter_handler)
+        ok(p_set_invalid_parameter_handler(NULL) == test_invalid_parameter_handler,
+                "Cannot reset invalid parameter handler\n");
 }
 
 static void test__mbsnbcat_s(void)
diff --git a/dlls/msvcrt/wcs.c b/dlls/msvcrt/wcs.c
index 1042008..a0d2d4e 100644
--- a/dlls/msvcrt/wcs.c
+++ b/dlls/msvcrt/wcs.c
@@ -1589,11 +1589,12 @@ INT CDECL MSVCRT_wcsncat_s(MSVCRT_wchar_t *dst, MSVCRT_size_t elem,
     MSVCRT_wchar_t dststart;
     INT ret = 0;
 
-    if (src == NULL && count > 0)
-        return MSVCRT_EINVAL;
-    if (dst == NULL)
+    if (!MSVCRT_CHECK_PMT(dst != NULL) || !MSVCRT_CHECK_PMT(elem > 0))
+    {
+        *MSVCRT__errno() = MSVCRT_EINVAL;
         return MSVCRT_EINVAL;
-    if (elem == 0)
+    }
+    if (!MSVCRT_CHECK_PMT(src != NULL || count == 0))
         return MSVCRT_EINVAL;
     if (count == 0)
         return 0;
@@ -1604,7 +1605,10 @@ INT CDECL MSVCRT_wcsncat_s(MSVCRT_wchar_t *dst, MSVCRT_size_t elem,
             break;
     }
     if (dststart == elem)
+    {
+        MSVCRT_INVALID_PMT("dst[elem] is not NULL terminated\n");
         return MSVCRT_EINVAL;
+    }
 
     if (count == MSVCRT__TRUNCATE)
     {
@@ -1623,6 +1627,7 @@ INT CDECL MSVCRT_wcsncat_s(MSVCRT_wchar_t *dst, MSVCRT_size_t elem,
         dst[srclen] = '\0';
         return ret;
     }
+    MSVCRT_INVALID_PMT("dst[elem] is too small");
     dst[0] = '\0';
     return MSVCRT_ERANGE;
 }






More information about the wine-patches mailing list