aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/kern_sig.c
diff options
context:
space:
mode:
authorEd Schouten <ed@FreeBSD.org>2015-08-12 11:30:31 +0000
committerEd Schouten <ed@FreeBSD.org>2015-08-12 11:30:31 +0000
commitf3fe76ecd8c1de89da516f2f13205887f1ada222 (patch)
tree4b9daaf7b779e473e058d7c4445039498c34151e /sys/kern/kern_sig.c
parent2c20fbe43a8d3b34b616a7c2c430c8164e8856bc (diff)
downloadsrc-f3fe76ecd8c1de89da516f2f13205887f1ada222.tar.gz
src-f3fe76ecd8c1de89da516f2f13205887f1ada222.zip
Unignore signals when starting CloudABI processes.
As CloudABI processes cannot adjust their signal handlers, we need to make sure that we start up CloudABI processes with consistent signal masks. Though the POSIx standard signal behavior is all right, we do need to make sure that we ignore SIGPIPE, as it would otherwise be hard to interact with pipes and sockets. Extend execsigs() to iterate over ps_sigignore and call sigdflt() for each of the ignored signals. Reviewed by: kib Obtained from: https://github.com/NuxiNL/freebsd Differential Revision: https://reviews.freebsd.org/D3365
Notes
Notes: svn path=/head/; revision=286662
Diffstat (limited to 'sys/kern/kern_sig.c')
-rw-r--r--sys/kern/kern_sig.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c
index e39290dd43c9..b57f6b6e5b9d 100644
--- a/sys/kern/kern_sig.c
+++ b/sys/kern/kern_sig.c
@@ -952,6 +952,7 @@ sigdflt(struct sigacts *ps, int sig)
void
execsigs(struct proc *p)
{
+ sigset_t osigignore;
struct sigacts *ps;
int sig;
struct thread *td;
@@ -971,6 +972,24 @@ execsigs(struct proc *p)
if ((sigprop(sig) & SA_IGNORE) != 0)
sigqueue_delete_proc(p, sig);
}
+
+ /*
+ * As CloudABI processes cannot modify signal handlers, fully
+ * reset all signals to their default behavior. Do ignore
+ * SIGPIPE, as it would otherwise be impossible to recover from
+ * writes to broken pipes and sockets.
+ */
+ if (SV_PROC_ABI(p) == SV_ABI_CLOUDABI) {
+ osigignore = ps->ps_sigignore;
+ while (SIGNOTEMPTY(osigignore)) {
+ sig = sig_ffs(&osigignore);
+ SIGDELSET(osigignore, sig);
+ if (sig != SIGPIPE)
+ sigdflt(ps, sig);
+ }
+ SIGADDSET(ps->ps_sigignore, SIGPIPE);
+ }
+
/*
* Reset stack state to the user stack.
* Clear set of signals caught on the signal stack.