From cd5ebed949f44173752c99b0c16268654b418c23 Mon Sep 17 00:00:00 2001 From: Claudio Jeker Date: Tue, 5 Nov 2024 09:14:20 +0000 Subject: Unlock ptsignal by using the ps_mtx instead of KERNEL_LOCK to ensure the process is not modified during signal delivery. This also unlocks psignal and prsignal since those are simple wrappers around ptsignal. OK mpi@ --- sys/kern/kern_sig.c | 33 ++++++++++++++++++++------------- sys/kern/sys_generic.c | 7 ++----- sys/kern/uipc_syscalls.c | 7 ++----- 3 files changed, 24 insertions(+), 23 deletions(-) (limited to 'sys/kern') diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index f37e2c774b9..e8e45c9517b 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_sig.c,v 1.346 2024/11/05 06:03:19 jsg Exp $ */ +/* $OpenBSD: kern_sig.c,v 1.347 2024/11/05 09:14:19 claudio Exp $ */ /* $NetBSD: kern_sig.c,v 1.54 1996/04/22 01:38:32 christos Exp $ */ /* @@ -124,6 +124,8 @@ void postsig_done(struct proc *, int, sigset_t, int); void postsig(struct proc *, int, struct sigctx *); int cansignal(struct proc *, struct process *, int); +void ptsignal_locked(struct proc *, int, enum signal_type); + struct pool sigacts_pool; /* memory pool for sigacts structures */ void sigio_del(struct sigiolst *); @@ -877,9 +879,7 @@ trapsignal(struct proc *p, int signum, u_long trapno, int code, sigexit(p, signum); /* NOTREACHED */ } - KERNEL_LOCK(); ptsignal(p, signum, STHREAD); - KERNEL_UNLOCK(); } } @@ -905,11 +905,14 @@ psignal(struct proc *p, int signum) void prsignal(struct process *pr, int signum) { + mtx_enter(&pr->ps_mtx); /* Ignore signal if the target process is exiting */ if (pr->ps_flags & PS_EXITING) { + mtx_leave(&pr->ps_mtx); return; } - ptsignal(TAILQ_FIRST(&pr->ps_threads), signum, SPROCESS); + ptsignal_locked(TAILQ_FIRST(&pr->ps_threads), signum, SPROCESS); + mtx_leave(&pr->ps_mtx); } /* @@ -919,6 +922,16 @@ prsignal(struct process *pr, int signum) */ void ptsignal(struct proc *p, int signum, enum signal_type type) +{ + struct process *pr = p->p_p; + + mtx_enter(&pr->ps_mtx); + ptsignal_locked(p, signum, type); + mtx_leave(&pr->ps_mtx); +} + +void +ptsignal_locked(struct proc *p, int signum, enum signal_type type) { int prop; sig_t action, altaction = SIG_DFL; @@ -928,7 +941,7 @@ ptsignal(struct proc *p, int signum, enum signal_type type) struct proc *q; int wakeparent = 0; - KERNEL_ASSERT_LOCKED(); + MUTEX_ASSERT_LOCKED(&pr->ps_mtx); #ifdef DIAGNOSTIC if ((u_int)signum >= NSIG || signum == 0) @@ -998,7 +1011,7 @@ ptsignal(struct proc *p, int signum, enum signal_type type) } if (type != SPROPAGATED) - knote(&pr->ps_klist, NOTE_SIGNAL | signum); + knote_locked(&pr->ps_klist, NOTE_SIGNAL | signum); prop = sigprop[signum]; @@ -1017,10 +1030,8 @@ ptsignal(struct proc *p, int signum, enum signal_type type) * and if it is set to SIG_IGN, * action will be SIG_DFL here.) */ - mtx_enter(&pr->ps_mtx); sigignore = pr->ps_sigacts->ps_sigignore; sigcatch = pr->ps_sigacts->ps_sigcatch; - mtx_leave(&pr->ps_mtx); if (sigignore & mask) return; @@ -1061,7 +1072,7 @@ ptsignal(struct proc *p, int signum, enum signal_type type) if (prop & (SA_CONT | SA_STOP) && type != SPROPAGATED) TAILQ_FOREACH(q, &pr->ps_threads, p_thr_link) if (q != p) - ptsignal(q, signum, SPROPAGATED); + ptsignal_locked(q, signum, SPROPAGATED); SCHED_LOCK(); @@ -2020,15 +2031,11 @@ userret(struct proc *p) /* send SIGPROF or SIGVTALRM if their timers interrupted this thread */ if (p->p_flag & P_PROFPEND) { atomic_clearbits_int(&p->p_flag, P_PROFPEND); - KERNEL_LOCK(); psignal(p, SIGPROF); - KERNEL_UNLOCK(); } if (p->p_flag & P_ALRMPEND) { atomic_clearbits_int(&p->p_flag, P_ALRMPEND); - KERNEL_LOCK(); psignal(p, SIGVTALRM); - KERNEL_UNLOCK(); } if (SIGPENDING(p) != 0) { diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index 935962c3eba..72014d5faaf 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sys_generic.c,v 1.158 2024/08/12 19:32:05 anton Exp $ */ +/* $OpenBSD: sys_generic.c,v 1.159 2024/11/05 09:14:19 claudio Exp $ */ /* $NetBSD: sys_generic.c,v 1.24 1996/03/29 00:25:32 cgd Exp $ */ /* @@ -382,11 +382,8 @@ dofilewritev(struct proc *p, int fd, struct uio *uio, int flags, if (uio->uio_resid != cnt && (error == ERESTART || error == EINTR || error == EWOULDBLOCK)) error = 0; - if (error == EPIPE) { - KERNEL_LOCK(); + if (error == EPIPE) ptsignal(p, SIGPIPE, STHREAD); - KERNEL_UNLOCK(); - } } cnt -= uio->uio_resid; diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c index 1ad1b7941d6..6d8b5ff4da9 100644 --- a/sys/kern/uipc_syscalls.c +++ b/sys/kern/uipc_syscalls.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uipc_syscalls.c,v 1.219 2024/04/25 17:32:53 bluhm Exp $ */ +/* $OpenBSD: uipc_syscalls.c,v 1.220 2024/11/05 09:14:19 claudio Exp $ */ /* $NetBSD: uipc_syscalls.c,v 1.19 1996/02/09 19:00:48 christos Exp $ */ /* @@ -788,11 +788,8 @@ sendit(struct proc *p, int s, struct msghdr *mp, int flags, register_t *retsize) if (auio.uio_resid != len && (error == ERESTART || error == EINTR || error == EWOULDBLOCK)) error = 0; - if (error == EPIPE && (flags & MSG_NOSIGNAL) == 0) { - KERNEL_LOCK(); + if (error == EPIPE && (flags & MSG_NOSIGNAL) == 0) ptsignal(p, SIGPIPE, STHREAD); - KERNEL_UNLOCK(); - } } if (error == 0) { *retsize = len - auio.uio_resid; -- cgit v1.2.3