Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 12 Aug 2015 11:30:32 +0000 (UTC)
From:      Ed Schouten <ed@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r286662 - head/sys/kern
Message-ID:  <201508121130.t7CBUW8C095476@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ed
Date: Wed Aug 12 11:30:31 2015
New Revision: 286662
URL: https://svnweb.freebsd.org/changeset/base/286662

Log:
  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

Modified:
  head/sys/kern/kern_sig.c

Modified: head/sys/kern/kern_sig.c
==============================================================================
--- head/sys/kern/kern_sig.c	Wed Aug 12 11:07:03 2015	(r286661)
+++ head/sys/kern/kern_sig.c	Wed Aug 12 11:30:31 2015	(r286662)
@@ -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.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201508121130.t7CBUW8C095476>