Revert the change that delivers process signals to any threads. As
authorbluhm <bluhm@openbsd.org>
Wed, 18 Jul 2018 16:55:17 +0000 (16:55 +0000)
committerbluhm <bluhm@openbsd.org>
Wed, 18 Jul 2018 16:55:17 +0000 (16:55 +0000)
side effect pending signals specifically sent to the main thread
were handled by other threads.  This made gcj in textproc/pdftk
port build stall.
Noticed and tested by espie@.

sys/kern/kern_sig.c
sys/sys/signalvar.h

index 7a8a7a9..72f5816 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: kern_sig.c,v 1.222 2018/07/11 19:28:16 bluhm Exp $    */
+/*     $OpenBSD: kern_sig.c,v 1.223 2018/07/18 16:55:17 bluhm Exp $    */
 /*     $NetBSD: kern_sig.c,v 1.54 1996/04/22 01:38:32 christos Exp $   */
 
 /*
@@ -1153,17 +1153,14 @@ issignal(struct proc *p)
        int s;
 
        for (;;) {
-               mask = SIGPENDING(p);
+               mask = p->p_siglist & ~p->p_sigmask;
                if (pr->ps_flags & PS_PPWAIT)
                        mask &= ~stopsigmask;
                if (mask == 0)          /* no signal to send */
                        return (0);
                signum = ffs((long)mask);
                mask = sigmask(signum);
-               if (p->p_siglist & mask)
-                       atomic_clearbits_int(&p->p_siglist, mask);
-               else
-                       atomic_clearbits_int(&pr->ps_mainproc->p_siglist, mask);
+               atomic_clearbits_int(&p->p_siglist, mask);
 
                /*
                 * We should see pending but ignored signals
@@ -1839,7 +1836,7 @@ userret(struct proc *p)
                KERNEL_UNLOCK();
        }
 
-       if (SIGPENDING(p) != 0) {
+       if (SIGPENDING(p)) {
                KERNEL_LOCK();
                while ((signum = CURSIG(p)) != 0)
                        postsig(p, signum);
index f5e0a07..91404eb 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: signalvar.h,v 1.32 2018/07/11 19:28:16 bluhm Exp $    */
+/*     $OpenBSD: signalvar.h,v 1.33 2018/07/18 16:55:17 bluhm Exp $    */
 /*     $NetBSD: signalvar.h,v 1.17 1996/04/22 01:23:31 christos Exp $  */
 
 /*
@@ -68,9 +68,7 @@ struct        sigacts {
 /*
  * Check if process p has an unmasked signal pending.
  */
-#define        SIGPENDING(p)                                                   \
-       (((p)->p_siglist | (p)->p_p->ps_mainproc->p_siglist) &          \
-           ~(p)->p_sigmask)
+#define        SIGPENDING(p)   (((p)->p_siglist & ~(p)->p_sigmask) != 0)
 
 /*
  * Determine signal that should be delivered to process p, the current
@@ -78,9 +76,10 @@ struct       sigacts {
  * action, the process stops in issignal().
  */
 #define        CURSIG(p)                                                       \
-       (((((p)->p_siglist | (p)->p_p->ps_mainproc->p_siglist) == 0) || \
-       (((p)->p_p->ps_flags & PS_TRACED) == 0 && SIGPENDING(p) == 0))  \
-           ? 0 : issignal(p))
+       (((p)->p_siglist == 0 ||                                        \
+           (((p)->p_p->ps_flags & PS_TRACED) == 0 &&                   \
+           ((p)->p_siglist & ~(p)->p_sigmask) == 0)) ?                 \
+           0 : issignal(p))
 
 /*
  * Clear a pending signal from a process.