[launchd-changes] [23356] trunk/launchd/src

source_changes at macosforge.org source_changes at macosforge.org
Wed Sep 5 11:20:21 PDT 2007


Revision: 23356
          http://trac.macosforge.org/projects/launchd/changeset/23356
Author:   zarzycki at apple.com
Date:     2007-09-05 11:20:21 -0700 (Wed, 05 Sep 2007)

Log Message:
-----------
<rdar://problem/5461936> signal handling bugs found during code audit

SIGTERM might be ignored for a tiny window post fork() and pre execve() in the child.

SIGTERM might be ignored for a tiny window of launchd's initialization of itself.

Modified Paths:
--------------
    trunk/launchd/src/launchd.c
    trunk/launchd/src/launchd_core_logic.c
    trunk/launchd/src/launchd_runtime.c
    trunk/launchd/src/launchd_runtime.h

Modified: trunk/launchd/src/launchd.c
===================================================================
--- trunk/launchd/src/launchd.c	2007-09-05 15:04:36 UTC (rev 23355)
+++ trunk/launchd/src/launchd.c	2007-09-05 18:20:21 UTC (rev 23356)
@@ -106,13 +106,7 @@
 int
 main(int argc, char *const *argv)
 {
-	static const int sigigns[] = { SIGHUP, SIGINT, SIGPIPE, SIGALRM,
-		SIGTERM, SIGURG, SIGTSTP, SIGTSTP, SIGCONT, SIGTTIN,
-		SIGTTOU, SIGIO, SIGXCPU, SIGXFSZ, SIGVTALRM, SIGPROF,
-		SIGWINCH, SIGINFO, SIGUSR1, SIGUSR2
-	};
 	bool sflag = false;
-	size_t i;
 	int ch;
 
 	testfd_or_openfd(STDIN_FILENO, _PATH_DEVNULL, O_RDONLY);
@@ -136,10 +130,6 @@
 
 	launchd_runtime_init();
 
-	for (i = 0; i < (sizeof(sigigns) / sizeof(int)); i++) {
-		launchd_assumes(signal(sigigns[i], SIG_IGN) != SIG_ERR);
-	}
-
 	if (NULL == getenv("PATH")) {
 		setenv("PATH", _PATH_STDPATH, 1);
 	}
@@ -152,13 +142,14 @@
 
 	monitor_networking_state();
 
-
 	if (getpid() == 1) {
 		handle_pid1_crashes_separately();
 	}
 
 	jobmgr_init(sflag);
 
+	launchd_runtime_init2();
+
 	launchd_runtime();
 }
 

Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c	2007-09-05 15:04:36 UTC (rev 23355)
+++ trunk/launchd/src/launchd_core_logic.c	2007-09-05 18:20:21 UTC (rev 23356)
@@ -2482,10 +2482,6 @@
 		job_assumes(j, binpref_out_cnt == j->j_binpref_cnt);
 	}
 
-	for (i = 1; i < NSIG; i++) {
-		signal(i, SIG_DFL);
-	}
-
 	if (j->quarantine_data) {
 		qtn_proc_t qp;
 

Modified: trunk/launchd/src/launchd_runtime.c
===================================================================
--- trunk/launchd/src/launchd_runtime.c	2007-09-05 15:04:36 UTC (rev 23355)
+++ trunk/launchd/src/launchd_runtime.c	2007-09-05 18:20:21 UTC (rev 23356)
@@ -54,6 +54,7 @@
 #include <stdlib.h>
 #include <stdbool.h>
 #include <syslog.h>
+#include <signal.h>
 #include <dlfcn.h>
 
 #include "launchd_internalServer.h"
@@ -105,6 +106,13 @@
 static bool logmsg_add(struct runtime_syslog_attr *attr, int err_num, const char *msg);
 static void logmsg_remove(struct logmsg_s *lm);
 
+
+static const int sigigns[] = { SIGHUP, SIGINT, SIGPIPE, SIGALRM, SIGTERM,
+	SIGURG, SIGTSTP, SIGTSTP, SIGCONT, SIGTTIN, SIGTTOU, SIGIO, SIGXCPU,
+	SIGXFSZ, SIGVTALRM, SIGPROF, SIGWINCH, SIGINFO, SIGUSR1, SIGUSR2
+};
+static sigset_t sigign_set;
+
 void
 launchd_runtime_init(void)
 {
@@ -143,6 +151,17 @@
 	runtime_setlogmask(LOG_UPTO(/* LOG_DEBUG */ LOG_NOTICE));
 }
 
+void
+launchd_runtime_init2(void)
+{
+	size_t i;
+
+	for (i = 0; i < (sizeof(sigigns) / sizeof(int)); i++) {
+		sigaddset(&sigign_set, sigigns[i]);
+		launchd_assumes(signal(sigigns[i], SIG_IGN) != SIG_ERR);
+	}
+}
+
 void *
 mport_demand_loop(void *arg __attribute__((unused)))
 {
@@ -583,19 +602,33 @@
 pid_t
 runtime_fork(mach_port_t bsport)
 {
+	sigset_t emptyset, oset;
 	pid_t r = -1;
 	int saved_errno;
+	size_t i;
 
+	sigemptyset(&emptyset);
+
 	launchd_assumes(launchd_mport_make_send(bsport) == KERN_SUCCESS);
 	launchd_assumes(launchd_set_bport(bsport) == KERN_SUCCESS);
 	launchd_assumes(launchd_mport_deallocate(bsport) == KERN_SUCCESS);
 
+	launchd_assumes(sigprocmask(SIG_BLOCK, &sigign_set, &oset) != -1);
+	for (i = 0; i < (sizeof(sigigns) / sizeof(int)); i++) {
+		launchd_assumes(signal(sigigns[i], SIG_DFL) != SIG_ERR);
+	}
+
 	r = fork();
-
 	saved_errno = errno;
 
 	if (r != 0) {
+		for (i = 0; i < (sizeof(sigigns) / sizeof(int)); i++) {
+			launchd_assumes(signal(sigigns[i], SIG_IGN) != SIG_ERR);
+		}
+		launchd_assumes(sigprocmask(SIG_SETMASK, &oset, NULL) != -1);
 		launchd_assumes(launchd_set_bport(MACH_PORT_NULL) == KERN_SUCCESS);
+	} else {
+		launchd_assumes(sigprocmask(SIG_SETMASK, &emptyset, NULL) != -1);
 	}
 
 	errno = saved_errno;

Modified: trunk/launchd/src/launchd_runtime.h
===================================================================
--- trunk/launchd/src/launchd_runtime.h	2007-09-05 15:04:36 UTC (rev 23355)
+++ trunk/launchd/src/launchd_runtime.h	2007-09-05 18:20:21 UTC (rev 23356)
@@ -57,6 +57,7 @@
 boolean_t launchd_internal_demux(mach_msg_header_t *Request, mach_msg_header_t *Reply);
 
 void launchd_runtime_init(void);
+void launchd_runtime_init2(void);
 void launchd_runtime(void) __attribute__((noreturn));
 
 int runtime_close(int fd);

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070905/dff6905e/attachment.html


More information about the launchd-changes mailing list