summaryrefslogtreecommitdiff
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-test2-f3fe76ecd8c1de89da516f2f13205887f1ada222.tar.gz
src-test2-f3fe76ecd8c1de89da516f2f13205887f1ada222.zip
Notes
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.