diff options
author | Ed Schouten <ed@FreeBSD.org> | 2015-08-12 11:30:31 +0000 |
---|---|---|
committer | Ed Schouten <ed@FreeBSD.org> | 2015-08-12 11:30:31 +0000 |
commit | f3fe76ecd8c1de89da516f2f13205887f1ada222 (patch) | |
tree | 4b9daaf7b779e473e058d7c4445039498c34151e /sys/kern/kern_sig.c | |
parent | 2c20fbe43a8d3b34b616a7c2c430c8164e8856bc (diff) | |
download | src-test2-f3fe76ecd8c1de89da516f2f13205887f1ada222.tar.gz src-test2-f3fe76ecd8c1de89da516f2f13205887f1ada222.zip |
Notes
Diffstat (limited to 'sys/kern/kern_sig.c')
-rw-r--r-- | sys/kern/kern_sig.c | 19 |
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. |