On Mon, Jun 07, 2021 at 07:06:23PM -0600, Theo de Raadt wrote:
> > It loops until the kernel has halted the machine. init process
> > jumps between signal handler and page fault trap.
>
> Hmm. That is probably ok.
Somehow I forgot about this mail thread.
Can I commit the diff below?
bluhm
Index: kern/kern_sig.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/kern/kern_sig.c,v
retrieving revision 1.281
diff -u -p -r1.281 kern_sig.c
--- kern/kern_sig.c 10 May 2021 18:01:24 -0000 1.281
+++ kern/kern_sig.c 6 Jul 2021 21:22:14 -0000
@@ -842,10 +842,16 @@ trapsignal(struct proc *p, int signum, u
* generated by the kernel, be ignorable or blockable.
* If it is and we're not being traced, then just kill
* the process.
+ * After vfs_shutdown(9), init(8) cannot receive signals
+ * because new code pages of the signal handler cannot be
+ * mapped from halted storage. init(8) may not die or the
+ * kernel panics. Better loop between signal handler and
+ * page fault trap until the machine is halted.
*/
if ((pr->ps_flags & PS_TRACED) == 0 &&
(sigprop[signum] & SA_KILL) &&
- ((p->p_sigmask & mask) || (ps->ps_sigignore & mask)))
+ ((p->p_sigmask & mask) || (ps->ps_sigignore & mask)) &&
+ pr->ps_pid != 1)
sigexit(p, signum);
ptsignal(p, signum, STHREAD);
}