git: 94f86eff72ed - main - uexterror_gettext: add tests for invalid formats

From: Brooks Davis <brooks_at_FreeBSD.org>
Date: Thu, 20 Aug 2026 10:41:57 UTC
The branch main has been updated by brooks:

URL: https://cgit.FreeBSD.org/src/commit/?id=94f86eff72ed43a38a12a41cd5945afe00c8199a

commit 94f86eff72ed43a38a12a41cd5945afe00c8199a
Author:     Brooks Davis <brooks@FreeBSD.org>
AuthorDate: 2026-08-20 10:40:06 +0000
Commit:     Brooks Davis <brooks@FreeBSD.org>
CommitDate: 2026-08-20 10:40:41 +0000

    uexterror_gettext: add tests for invalid formats
    
    Verify that unsupported, unterminated, and overly long formats output
    expected messages.
    
    Reviewed by:    kib
    Effort:         CHERI upstreaming
    Sponsored by:   Innovate UK
    Differential Revision:  https://reviews.freebsd.org/D58413
---
 tests/sys/kern/exterr_test.c | 66 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 66 insertions(+)

diff --git a/tests/sys/kern/exterr_test.c b/tests/sys/kern/exterr_test.c
index 75de58d27206..fc040c53517d 100644
--- a/tests/sys/kern/exterr_test.c
+++ b/tests/sys/kern/exterr_test.c
@@ -108,6 +108,71 @@ ATF_TC_BODY(uexterr_set, tc)
 	ATF_CHECK_STREQ("long 0xffffffffffffffff int 4294967295", exterr);
 }
 
+static void
+check_bad_fmt(const char *fmt)
+{
+	char exterr[UEXTERROR_MAXLEN];
+	char expected[UEXTERROR_MAXLEN];
+	int r;
+
+	sprintf(expected, "<unsupported-format>:%s", fmt);
+
+	errno = 0;
+	UEXTERROR(EINVAL, fmt, 0xAAAAAAAAAAAAAAAA);
+	ATF_CHECK_EQ(errno, EINVAL);
+	r = uexterr_gettext(exterr, sizeof(exterr));
+	ATF_CHECK_EQ(0, r);
+	ATF_CHECK_STREQ(expected, exterr);
+}
+
+ATF_TC(uexterr_bad_fmt);
+ATF_TC_HEAD(uexterr_bad_fmt, tc)
+{
+	atf_tc_set_md_var(tc, "descr", "Test invalid or unsupported formats");
+}
+ATF_TC_BODY(uexterr_bad_fmt, tc)
+{
+	char exterr[UEXTERROR_MAXLEN];
+	int r;
+	int target = 0;
+
+	/* Write gadget */
+	errno = 0;
+	UEXTERROR(EINVAL, "write to %n", (uintptr_t)&target);
+	ATF_CHECK_EQ_MSG(0, target, "Write via %%n happened");
+	ATF_CHECK_EQ(errno, EINVAL);
+	r = uexterr_gettext(exterr, sizeof(exterr));
+	ATF_CHECK_EQ(0, r);
+	ATF_CHECK_STREQ("write to <illegal-format>:%n", exterr);
+
+	/* Too long */
+	errno = 0;
+	UEXTERROR(EINVAL, "%llllllllllllllllllllllllllllllllllllllllllllllld",
+	    0xAAAAAAAAAAAAAAAA);
+	ATF_CHECK_EQ(errno, EINVAL);
+	r = uexterr_gettext(exterr, sizeof(exterr));
+	ATF_CHECK_EQ(0, r);
+	ATF_CHECK_STREQ("<format-too-large>", exterr);
+
+	/* Incomplete */
+	check_bad_fmt("%");
+	check_bad_fmt("%l");
+
+	/* Obsolete or nonsensical */
+	check_bad_fmt("%D");
+	check_bad_fmt("%O");
+	check_bad_fmt("%U");
+	check_bad_fmt("%f");
+	check_bad_fmt("%F");
+	check_bad_fmt("%g");
+	check_bad_fmt("%G");
+	check_bad_fmt("%a");
+	check_bad_fmt("%A");
+	check_bad_fmt("%S");
+	check_bad_fmt("%s");
+	check_bad_fmt("%m");
+}
+
 ATF_TC(gettext_noextended);
 ATF_TC_HEAD(gettext_noextended, tc)
 {
@@ -184,6 +249,7 @@ ATF_TP_ADD_TCS(tp)
 {
 	ATF_TP_ADD_TC(tp, gettext_extended);
 	ATF_TP_ADD_TC(tp, uexterr_set);
+	ATF_TP_ADD_TC(tp, uexterr_bad_fmt);
 	ATF_TP_ADD_TC(tp, gettext_noextended);
 	ATF_TP_ADD_TC(tp, gettext_noextended_after_extended);
 	ATF_TP_ADD_TC(tp, exterr_dynamic_categories);