Fix a bug in r358168, do not call sigfastblock_setpend() under a mutex.

PR:	244250
Reported and tested by:	lwhsu
Sponsored by:	The FreeBSD Foundation
This commit is contained in:
Konstantin Belousov 2020-02-20 21:25:12 +00:00
parent 9a990500e5
commit 74cb9a5333

View File

@ -326,22 +326,24 @@ ast(struct trapframe *framep)
if (flags & TDF_NEEDSIGCHK || p->p_pendingcnt > 0 ||
!SIGISEMPTY(p->p_siglist)) {
sigfastblock_fetch(td);
PROC_LOCK(p);
mtx_lock(&p->p_sigacts->ps_mtx);
if ((td->td_pflags & TDP_SIGFASTBLOCK) != 0 &&
td->td_sigblock_val != 0) {
sigfastblock_setpend(td);
PROC_LOCK(p);
reschedule_signals(p, fastblock_mask,
SIGPROCMASK_PS_LOCKED | SIGPROCMASK_FASTBLK);
SIGPROCMASK_FASTBLK);
PROC_UNLOCK(p);
} else {
PROC_LOCK(p);
mtx_lock(&p->p_sigacts->ps_mtx);
while ((sig = cursig(td)) != 0) {
KASSERT(sig >= 0, ("sig %d", sig));
postsig(sig);
}
}
mtx_unlock(&p->p_sigacts->ps_mtx);
PROC_UNLOCK(p);
}
}
/*
* Handle deferred update of the fast sigblock value, after