Module Name:    src
Committed By:   riastradh
Date:           Sat Aug 17 21:31:22 UTC 2024

Modified Files:
        src/tests/lib/libc/locale: t_c16rtomb.c t_c8rtomb.c

Log Message:
c8rtomb(3), c16rtomb(3): Add tests for incomplete NUL termination.

PR lib/58615: incomplete c8rtomb, c16rtomb handles NUL termination
wrong


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/tests/lib/libc/locale/t_c16rtomb.c \
    src/tests/lib/libc/locale/t_c8rtomb.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/lib/libc/locale/t_c16rtomb.c
diff -u src/tests/lib/libc/locale/t_c16rtomb.c:1.1 src/tests/lib/libc/locale/t_c16rtomb.c:1.2
--- src/tests/lib/libc/locale/t_c16rtomb.c:1.1	Thu Aug 15 14:16:34 2024
+++ src/tests/lib/libc/locale/t_c16rtomb.c	Sat Aug 17 21:31:22 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_c16rtomb.c,v 1.1 2024/08/15 14:16:34 riastradh Exp $	*/
+/*	$NetBSD: t_c16rtomb.c,v 1.2 2024/08/17 21:31:22 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2002 Tim J. Robbins
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: t_c16rtomb.c,v 1.1 2024/08/15 14:16:34 riastradh Exp $");
+__RCSID("$NetBSD: t_c16rtomb.c,v 1.2 2024/08/17 21:31:22 riastradh Exp $");
 
 #include <errno.h>
 #include <limits.h>
@@ -103,6 +103,17 @@ ATF_TC_BODY(c16rtomb_c_locale_test, tc)
 	    "n=%zu", n);
 	ATF_CHECK_EQ_MSG(errno, EILSEQ, "errno=%d", errno);
 	ATF_CHECK_EQ_MSG((unsigned char)buf[0], 0xcc, "buf=[%02x]", buf[0]);
+
+	/* Incomplete Unicode character 'Pile of poo', interrupted by NUL. */
+	memset(&s, 0, sizeof(s));
+	memset(buf, 0xcc, sizeof(buf));
+	ATF_CHECK_EQ_MSG((n = c16rtomb(buf, 0xd83d, &s)), 0, "n=%zu", n);
+	atf_tc_expect_fail("PR lib/58615:"
+	    " incomplete c8rtomb, c16rtomb handles NUL termination wrong");
+	ATF_CHECK_EQ_MSG((n = c16rtomb(buf, L'\0', &s)), 1, "n=%zu", n);
+	ATF_CHECK_MSG(((unsigned char)buf[0] == '\0' &&
+		(unsigned char)buf[1] == 0xcc),
+	    "buf=[%02x %02x]", buf[0], buf[1]);
 }
 
 ATF_TC_WITHOUT_HEAD(c16rtomb_iso_8859_1_test);
@@ -173,6 +184,18 @@ ATF_TC_BODY(c16rtomb_utf_8_test, tc)
 	    "n=%zu", n);
 	ATF_CHECK_EQ_MSG(errno, EILSEQ, "errno=%d", errno);
 	ATF_CHECK_EQ_MSG((unsigned char)buf[0], 0xcc, "buf=[%02x]", buf[0]);
+
+	/* Incomplete Unicode character 'Pile of poo', interrupted by NUL. */
+	memset(&s, 0, sizeof(s));
+	memset(buf, 0xcc, sizeof(buf));
+	ATF_CHECK_EQ_MSG((n = c16rtomb(buf, 0xd83d, &s)), 0, "n=%zu", n);
+	atf_tc_expect_fail("PR lib/58615:"
+	    " incomplete c8rtomb, c16rtomb handles NUL termination wrong");
+	ATF_CHECK_EQ_MSG((n = c16rtomb(buf, L'\0', &s)), 1,
+	    "n=%zu", n);
+	ATF_CHECK_MSG(((unsigned char)buf[0] == '\0' &&
+		(unsigned char)buf[1] == 0xcc),
+	    "buf=[%02x %02x]", buf[0], buf[1]);
 }
 
 ATF_TP_ADD_TCS(tp)
Index: src/tests/lib/libc/locale/t_c8rtomb.c
diff -u src/tests/lib/libc/locale/t_c8rtomb.c:1.1 src/tests/lib/libc/locale/t_c8rtomb.c:1.2
--- src/tests/lib/libc/locale/t_c8rtomb.c:1.1	Thu Aug 15 21:19:45 2024
+++ src/tests/lib/libc/locale/t_c8rtomb.c	Sat Aug 17 21:31:22 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_c8rtomb.c,v 1.1 2024/08/15 21:19:45 riastradh Exp $	*/
+/*	$NetBSD: t_c8rtomb.c,v 1.2 2024/08/17 21:31:22 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2002 Tim J. Robbins
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: t_c8rtomb.c,v 1.1 2024/08/15 21:19:45 riastradh Exp $");
+__RCSID("$NetBSD: t_c8rtomb.c,v 1.2 2024/08/17 21:31:22 riastradh Exp $");
 
 #include <errno.h>
 #include <limits.h>
@@ -82,7 +82,6 @@ ATF_TC_BODY(c8rtomb_c_locale_test, tc)
 	ATF_CHECK_EQ_MSG((n = c8rtomb(NULL, 0xfe, NULL)), 1, "n=%zu", n);
 	ATF_CHECK_EQ_MSG((n = c8rtomb(NULL, 0xff, NULL)), 1, "n=%zu", n);
 
-
 	/* Null wide character. */
 	memset(&s, 0, sizeof(s));
 	memset(buf, 0xcc, sizeof(buf));
@@ -113,6 +112,36 @@ ATF_TC_BODY(c8rtomb_c_locale_test, tc)
 	    "n=%zu", n);
 	ATF_CHECK_EQ_MSG(errno, EILSEQ, "errno=%d", errno);
 	ATF_CHECK_EQ_MSG((unsigned char)buf[0], 0xcc, "buf=[%02x]", buf[0]);
+
+	/* Incomplete Unicode character 'Pile of poo', interrupted by NUL. */
+	memset(&s, 0, sizeof(s));
+	memset(buf, 0xcc, sizeof(buf));
+	ATF_CHECK_EQ_MSG((n = c8rtomb(buf, 0xf0, &s)), 0, "n=%zu", n);
+	atf_tc_expect_fail("PR lib/58615:"
+	    " incomplete c8rtomb, c16rtomb handles NUL termination wrong");
+	ATF_CHECK_EQ_MSG((n = c8rtomb(buf, '\0', &s)), 1, "n=%zu", n);
+	ATF_CHECK_MSG(((unsigned char)buf[0] == '\0' &&
+		(unsigned char)buf[1] == 0xcc),
+	    "buf=[%02x %02x]", buf[0], buf[1]);
+
+	memset(&s, 0, sizeof(s));
+	memset(buf, 0xcc, sizeof(buf));
+	ATF_CHECK_EQ_MSG((n = c8rtomb(buf, 0xf0, &s)), 0, "n=%zu", n);
+	ATF_CHECK_EQ_MSG((n = c8rtomb(buf, 0x9f, &s)), 0, "n=%zu", n);
+	ATF_CHECK_EQ_MSG((n = c8rtomb(buf, '\0', &s)), 1, "n=%zu", n);
+	ATF_CHECK_MSG(((unsigned char)buf[0] == '\0' &&
+		(unsigned char)buf[1] == 0xcc),
+	    "buf=[%02x %02x]", buf[0], buf[1]);
+
+	memset(&s, 0, sizeof(s));
+	memset(buf, 0xcc, sizeof(buf));
+	ATF_CHECK_EQ_MSG((n = c8rtomb(buf, 0xf0, &s)), 0, "n=%zu", n);
+	ATF_CHECK_EQ_MSG((n = c8rtomb(buf, 0x9f, &s)), 0, "n=%zu", n);
+	ATF_CHECK_EQ_MSG((n = c8rtomb(buf, 0x92, &s)), 0, "n=%zu", n);
+	ATF_CHECK_EQ_MSG((n = c8rtomb(buf, '\0', &s)), 1, "n=%zu", n);
+	ATF_CHECK_MSG(((unsigned char)buf[0] == '\0' &&
+		(unsigned char)buf[1] == 0xcc),
+	    "buf=[%02x %02x]", buf[0], buf[1]);
 }
 
 ATF_TC_WITHOUT_HEAD(c8rtomb_iso_8859_1_test);
@@ -191,6 +220,36 @@ ATF_TC_BODY(c8rtomb_utf_8_test, tc)
 	    "n=%zu", n);
 	ATF_CHECK_EQ_MSG(errno, EILSEQ, "errno=%d", errno);
 	ATF_CHECK_EQ_MSG((unsigned char)buf[0], 0xcc, "buf=[%02x]", buf[0]);
+
+	/* Incomplete Unicode character 'Pile of poo', interrupted by NUL. */
+	memset(&s, 0, sizeof(s));
+	memset(buf, 0xcc, sizeof(buf));
+	ATF_CHECK_EQ_MSG((n = c8rtomb(buf, 0xf0, &s)), 0, "n=%zu", n);
+	atf_tc_expect_fail("PR lib/58615:"
+	    " incomplete c8rtomb, c16rtomb handles NUL termination wrong");
+	ATF_CHECK_EQ_MSG((n = c8rtomb(buf, '\0', &s)), 1, "n=%zu", n);
+	ATF_CHECK_MSG(((unsigned char)buf[0] == '\0' &&
+		(unsigned char)buf[1] == 0xcc),
+	    "buf=[%02x %02x]", buf[0], buf[1]);
+
+	memset(&s, 0, sizeof(s));
+	memset(buf, 0xcc, sizeof(buf));
+	ATF_CHECK_EQ_MSG((n = c8rtomb(buf, 0xf0, &s)), 0, "n=%zu", n);
+	ATF_CHECK_EQ_MSG((n = c8rtomb(buf, 0x9f, &s)), 0, "n=%zu", n);
+	ATF_CHECK_EQ_MSG((n = c8rtomb(buf, '\0', &s)), 1, "n=%zu", n);
+	ATF_CHECK_MSG(((unsigned char)buf[0] == '\0' &&
+		(unsigned char)buf[1] == 0xcc),
+	    "buf=[%02x %02x]", buf[0], buf[1]);
+
+	memset(&s, 0, sizeof(s));
+	memset(buf, 0xcc, sizeof(buf));
+	ATF_CHECK_EQ_MSG((n = c8rtomb(buf, 0xf0, &s)), 0, "n=%zu", n);
+	ATF_CHECK_EQ_MSG((n = c8rtomb(buf, 0x9f, &s)), 0, "n=%zu", n);
+	ATF_CHECK_EQ_MSG((n = c8rtomb(buf, 0x92, &s)), 0, "n=%zu", n);
+	ATF_CHECK_EQ_MSG((n = c8rtomb(buf, '\0', &s)), 1, "n=%zu", n);
+	ATF_CHECK_MSG(((unsigned char)buf[0] == '\0' &&
+		(unsigned char)buf[1] == 0xcc),
+	    "buf=[%02x %02x]", buf[0], buf[1]);
 }
 
 ATF_TP_ADD_TCS(tp)

Reply via email to