diff options
author | 2002-06-11 08:19:17 +0000 | |
---|---|---|
committer | 2002-06-11 08:19:17 +0000 | |
commit | d7b1c986b447dbe5747ab9217f07df1a04b0fb35 (patch) | |
tree | 9426ce4ddc8f9f9f81f803aec93e9801a2b305ba | |
parent | use "ntop" only after initialized (diff) | |
download | wireguard-openbsd-d7b1c986b447dbe5747ab9217f07df1a04b0fb35.tar.xz wireguard-openbsd-d7b1c986b447dbe5747ab9217f07df1a04b0fb35.zip |
Protect mi_switch with splstatclock.
-rw-r--r-- | sys/kern/kern_sig.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index ea11da63661..cffbae69df0 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_sig.c,v 1.58 2002/05/08 19:24:42 millert Exp $ */ +/* $OpenBSD: kern_sig.c,v 1.59 2002/06/11 08:19:17 art Exp $ */ /* $NetBSD: kern_sig.c,v 1.54 1996/04/22 01:38:32 christos Exp $ */ /* @@ -978,10 +978,10 @@ out: * postsig(signum); */ int -issignal(p) - register struct proc *p; +issignal(struct proc *p) { - register int signum, mask, prop; + int signum, mask, prop; + int s; for (;;) { mask = p->p_siglist & ~p->p_sigmask; @@ -1007,6 +1007,7 @@ issignal(p) */ p->p_xstat = signum; + s = splstatclock(); /* protect mi_switch */ if (p->p_flag & P_FSTRACE) { #ifdef PROCFS /* procfs debugging */ @@ -1022,6 +1023,7 @@ issignal(p) proc_stop(p); mi_switch(); } + splx(s); /* * If we are no longer being traced, or the parent @@ -1081,7 +1083,9 @@ issignal(p) if ((p->p_pptr->p_flag & P_NOCLDSTOP) == 0) psignal(p->p_pptr, SIGCHLD); proc_stop(p); + s = splstatclock(); mi_switch(); + splx(s); break; } else if (prop & SA_IGNORE) { /* |