summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authormpi <mpi@openbsd.org>2020-11-08 20:37:21 +0000
committermpi <mpi@openbsd.org>2020-11-08 20:37:21 +0000
commit1e286331f8cc3115cda0264eb0f546f9bd24d75a (patch)
tree4743f2d6419d9d09ad27b84456b2848969bb6f15 /sys/kern
parentAdd seperate FROM/TO variables. (diff)
downloadwireguard-openbsd-1e286331f8cc3115cda0264eb0f546f9bd24d75a.tar.xz
wireguard-openbsd-1e286331f8cc3115cda0264eb0f546f9bd24d75a.zip
In case of failure, call sigexit() from trapsignal instead of sensig().
Simplify MD code and reduce the amount of recursion into the signal code which helps when dealing with locks. ok cheloha@, deraadt@
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/kern_sig.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c
index b1c6f11c745..0cd78b46de5 100644
--- a/sys/kern/kern_sig.c
+++ b/sys/kern/kern_sig.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_sig.c,v 1.263 2020/09/16 13:50:42 mpi Exp $ */
+/* $OpenBSD: kern_sig.c,v 1.264 2020/11/08 20:37:24 mpi Exp $ */
/* $NetBSD: kern_sig.c,v 1.54 1996/04/22 01:38:32 christos Exp $ */
/*
@@ -464,6 +464,8 @@ sys_sigprocmask(struct proc *p, void *v, register_t *retval)
int error = 0;
sigset_t mask;
+ KASSERT(p == curproc);
+
*retval = p->p_sigmask;
mask = SCARG(uap, mask) &~ sigcantmask;
@@ -824,7 +826,10 @@ trapsignal(struct proc *p, int signum, u_long trapno, int code,
p->p_sigmask, code, &si);
}
#endif
- sendsig(ps->ps_sigact[signum], signum, p->p_sigmask, &si);
+ if (sendsig(ps->ps_sigact[signum], signum, p->p_sigmask, &si)) {
+ sigexit(p, SIGILL);
+ /* NOTREACHED */
+ }
postsig_done(p, signum, ps);
} else {
p->p_sisig = signum;
@@ -1452,7 +1457,10 @@ postsig(struct proc *p, int signum)
p->p_sigval.sival_ptr = NULL;
}
- sendsig(action, signum, returnmask, &si);
+ if (sendsig(action, signum, returnmask, &si)) {
+ sigexit(p, SIGILL);
+ /* NOTREACHED */
+ }
postsig_done(p, signum, ps);
splx(s);
}