svn commit: r358182 - head/sys/kern

Konstantin Belousov kib at FreeBSD.org
Thu Feb 20 21:25:12 UTC 2020


Author: kib
Date: Thu Feb 20 21:25:12 2020
New Revision: 358182
URL: https://svnweb.freebsd.org/changeset/base/358182

Log:
  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

Modified:
  head/sys/kern/subr_trap.c

Modified: head/sys/kern/subr_trap.c
==============================================================================
--- head/sys/kern/subr_trap.c	Thu Feb 20 21:12:10 2020	(r358181)
+++ head/sys/kern/subr_trap.c	Thu Feb 20 21:25:12 2020	(r358182)
@@ -326,21 +326,23 @@ 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);
 		}
-		mtx_unlock(&p->p_sigacts->ps_mtx);
-		PROC_UNLOCK(p);
 	}
 
 	/*


More information about the svn-src-all mailing list