DragonFlyBSD Kernel Audit
DF-2693 / fix.diff
← back to finding ↓ download raw
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c
--- a/sys/kern/kern_sig.c	2026-08-30 22:26:27.772626378 +0000
+++ b/sys/kern/kern_sig.c	2026-08-30 22:26:27.784626229 +0000
@@ -2305,9 +2305,16 @@
 	} else {
 		/*
 		 * If we get here, the signal must be caught.
+		 *
+		 * ... unless another LWP of this process raced us with
+		 * sigaction(sig, SIG_IGN) between the CURSIG() decision
+		 * in userret() and our read of ps_sigact[] (which is
+		 * done without p_token when the signal was lwp-pending).
+		 * The racer already cleared the pending state; drop the
+		 * signal instead of panicking.
 		 */
-		KASSERT(action != SIG_IGN && !SIGISMEMBER(lp->lwp_sigmask, sig),
-		    ("postsig action"));
+		if (action == SIG_IGN || SIGISMEMBER(lp->lwp_sigmask, sig))
+			return;
 
 		/*
 		 * Reset the signal handler if asked to