diff options
author | kib <kib@FreeBSD.org> | 2017-05-19 09:04:18 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2017-05-19 09:04:18 +0000 |
commit | 8edeb87b91f391fe158e78b3acb0ecd1e40ee27c (patch) | |
tree | c56bd04e707ab96ba390c8761156a50bd8ae8d77 /sys/kern/kern_sig.c | |
parent | b37f72ba9c77ee939fc03352de4f6001d6155132 (diff) | |
download | FreeBSD-src-8edeb87b91f391fe158e78b3acb0ecd1e40ee27c.zip FreeBSD-src-8edeb87b91f391fe158e78b3acb0ecd1e40ee27c.tar.gz |
MFC r318243:
Do not wake up sleeping thread in reschedule_signals() if the signal
is blocked. The spurious wakeup might result in spurious EINTR.
PR: 219228
Diffstat (limited to 'sys/kern/kern_sig.c')
-rw-r--r-- | sys/kern/kern_sig.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index a3ff180..f9c44b4 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -2664,7 +2664,9 @@ reschedule_signals(struct proc *p, sigset_t block, int flags) signotify(td); if (!(flags & SIGPROCMASK_PS_LOCKED)) mtx_lock(&ps->ps_mtx); - if (p->p_flag & P_TRACED || SIGISMEMBER(ps->ps_sigcatch, sig)) + if (p->p_flag & P_TRACED || + (SIGISMEMBER(ps->ps_sigcatch, sig) && + !SIGISMEMBER(td->td_sigmask, sig))) tdsigwakeup(td, sig, SIG_CATCH, (SIGISMEMBER(ps->ps_sigintr, sig) ? EINTR : ERESTART)); |