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);
        }

Reply via email to