git: 109b9f48ec4e - main - kern/kern_exit.c: define the exterror category for exit/wait

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Sun, 25 Jan 2026 15:56:51 UTC
The branch main has been updated by kib:

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

commit 109b9f48ec4e26e12ab5765747f3d5156aa62406
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-01-08 04:03:51 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-01-25 15:53:22 +0000

    kern/kern_exit.c: define the exterror category for exit/wait
    
    Convert EINVALs in kern_exit.c into EXTERRORs.
    
    Reviewed by:    asomers, markj
    Tested by:      pho
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D54592
---
 sys/kern/kern_exit.c | 39 +++++++++++++++++++++++++--------------
 sys/sys/exterr_cat.h |  1 +
 2 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c
index 44d2bddf53fb..db6e91f00534 100644
--- a/sys/kern/kern_exit.c
+++ b/sys/kern/kern_exit.c
@@ -37,10 +37,12 @@
 #include "opt_ddb.h"
 #include "opt_ktrace.h"
 
+#define EXTERR_CATEGORY	EXTERR_CAT_PROCEXIT
 #include <sys/systm.h>
 #include <sys/acct.h>		/* for acct_process() function prototype */
 #include <sys/capsicum.h>
 #include <sys/eventhandler.h>
+#include <sys/exterrvar.h>
 #include <sys/filedesc.h>
 #include <sys/jail.h>
 #include <sys/kernel.h>
@@ -1269,6 +1271,26 @@ report_alive_proc(struct thread *td, struct proc *p, siginfo_t *siginfo,
 	PROC_UNLOCK(p);
 }
 
+static int
+wait6_checkopt(int options)
+{
+	/* If we don't know the option, just return. */
+	if ((options & ~(WUNTRACED | WNOHANG | WCONTINUED | WNOWAIT |
+	    WEXITED | WTRAPPED | WLINUXCLONE)) != 0)
+		return (EXTERROR(EINVAL, "Unknown options %#jx", options));
+	if ((options & (WEXITED | WUNTRACED | WCONTINUED | WTRAPPED)) == 0) {
+		/*
+		 * We will be unable to find any matching processes,
+		 * because there are no known events to look for.
+		 * Prefer to return error instead of blocking
+		 * indefinitely.
+		 */
+		return (EXTERROR(EINVAL,
+		    "Cannot match processes %#jx", options));
+	}
+	return (0);
+}
+
 int
 kern_wait6(struct thread *td, idtype_t idtype, id_t id, int *status,
     int options, struct __wrusage *wrusage, siginfo_t *siginfo)
@@ -1291,20 +1313,9 @@ kern_wait6(struct thread *td, idtype_t idtype, id_t id, int *status,
 		idtype = P_PGID;
 	}
 
-	/* If we don't know the option, just return. */
-	if ((options & ~(WUNTRACED | WNOHANG | WCONTINUED | WNOWAIT |
-	    WEXITED | WTRAPPED | WLINUXCLONE)) != 0)
-		return (EINVAL);
-	if ((options & (WEXITED | WUNTRACED | WCONTINUED | WTRAPPED)) == 0) {
-		/*
-		 * We will be unable to find any matching processes,
-		 * because there are no known events to look for.
-		 * Prefer to return error instead of blocking
-		 * indefinitely.
-		 */
-		return (EINVAL);
-	}
-
+	error = wait6_checkopt(options);
+	if (error != 0)
+		return (error);
 loop:
 	if (q->p_flag & P_STATCHILD) {
 		PROC_LOCK(q);
diff --git a/sys/sys/exterr_cat.h b/sys/sys/exterr_cat.h
index daf0419754b7..015eb6a1ae76 100644
--- a/sys/sys/exterr_cat.h
+++ b/sys/sys/exterr_cat.h
@@ -38,6 +38,7 @@
 #define	EXTERR_CAT_FUSE_VFS	13
 #define	EXTERR_CAT_FUSE_DEVICE	14
 #define	EXTERR_CAT_FORK		15
+#define	EXTERR_CAT_PROCEXIT	16
 
 #endif