git: ddf6065122e8 - main - exterr(9): add a few tests of new message formats

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

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

commit ddf6065122e8990eafe31d21adaf719a25924a73
Author:     Brooks Davis <brooks@FreeBSD.org>
AuthorDate: 2026-08-20 10:39:46 +0000
Commit:     Brooks Davis <brooks@FreeBSD.org>
CommitDate: 2026-08-20 10:40:31 +0000

    exterr(9): add a few tests of new message formats
    
    This is enough to show that the idea works (and to exercise
    uexterr_set()), but isn't complete by any means.
    
    Reviewed by:    kib
    Effort:         CHERI upstreaming
    Sponsored by:   Innovate UK
    Differential Revision:  https://reviews.freebsd.org/D58060
---
 tests/sys/kern/exterr_test.c | 34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

diff --git a/tests/sys/kern/exterr_test.c b/tests/sys/kern/exterr_test.c
index fad002767163..75de58d27206 100644
--- a/tests/sys/kern/exterr_test.c
+++ b/tests/sys/kern/exterr_test.c
@@ -23,6 +23,8 @@
  * SUCH DAMAGE.
  */
 
+#define UEXTERR_CATEGORY "tests/sys/kern/exterr_test.c"
+
 #include <sys/param.h>
 #include <sys/exterrvar.h>
 #include <sys/mman.h>
@@ -31,9 +33,11 @@
 #include <atf-c.h>
 #include <errno.h>
 #include <exterr.h>
+#include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <uexterror.h>
 #include <unistd.h>
 
 #include "freebsd_test_suite/macros.h"
@@ -75,6 +79,35 @@ ATF_TC_BODY(gettext_extended, tc)
 	ATF_CHECK(strstr(exterr, " is not subset of ") != NULL);
 }
 
+ATF_TC(uexterr_set);
+ATF_TC_HEAD(uexterr_set, tc)
+{
+	atf_tc_set_md_var(tc, "descr",
+	    "Set extended error message from userspace");
+}
+ATF_TC_BODY(uexterr_set, tc)
+{
+	char exterr[UEXTERROR_MAXLEN];
+	int r;
+
+	errno = 0;
+	UEXTERROR(EINVAL, "pointer %p int %d", (uintptr_t)&r, UINTMAX_MAX);
+	ATF_CHECK_EQ(errno, EINVAL);
+	r = uexterr_gettext(exterr, sizeof(exterr));
+	ATF_CHECK_EQ(0, r);
+	printf("Extended error: %s\n", exterr);
+	/* The pointer's value will change, but the rest should be stable. */
+	ATF_CHECK(strncmp("pointer 0x", exterr, strlen("pointer 0x")) == 0);
+	ATF_CHECK(strstr(exterr, " int -1") != 0);
+
+	errno = 0;
+	UEXTERROR(EINVAL, "long 0x%lx int %u", UINTMAX_MAX, UINTMAX_MAX);
+	ATF_CHECK_EQ(errno, EINVAL);
+	r = uexterr_gettext(exterr, sizeof(exterr));
+	ATF_CHECK_EQ(0, r);
+	ATF_CHECK_STREQ("long 0xffffffffffffffff int 4294967295", exterr);
+}
+
 ATF_TC(gettext_noextended);
 ATF_TC_HEAD(gettext_noextended, tc)
 {
@@ -150,6 +183,7 @@ ATF_TC_BODY(exterr_dynamic_categories, tc)
 ATF_TP_ADD_TCS(tp)
 {
 	ATF_TP_ADD_TC(tp, gettext_extended);
+	ATF_TP_ADD_TC(tp, uexterr_set);
 	ATF_TP_ADD_TC(tp, gettext_noextended);
 	ATF_TP_ADD_TC(tp, gettext_noextended_after_extended);
 	ATF_TP_ADD_TC(tp, exterr_dynamic_categories);