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

source_changes at macosforge.org source_changes at macosforge.org
Wed Feb 7 10:26:57 PST 2007


Revision: 23037
          http://trac.macosforge.org/projects/launchd/changeset/23037
Author:   zarzycki at apple.com
Date:     2007-02-07 10:26:57 -0800 (Wed, 07 Feb 2007)

Log Message:
-----------
<rdar://problem/4941920> job_export_all() crash via launchd's Unix IPC

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

Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c	2007-02-07 17:39:53 UTC (rev 23036)
+++ trunk/launchd/src/launchd_core_logic.c	2007-02-07 18:26:57 UTC (rev 23037)
@@ -976,9 +976,7 @@
 		return NULL;
 	}
 
-	job_dispatch(j, false);
-
-	return j;
+	return job_dispatch(j, false);
 }
 
 launch_data_t
@@ -1641,19 +1639,19 @@
 void
 jobmgr_dispatch_all(jobmgr_t jm)
 {
-	jobmgr_t jmi;
-	job_t ji;
+	jobmgr_t jmi, jmn;
+	job_t ji, jn;
 
-	SLIST_FOREACH(jmi, &jm->submgrs, sle) {
+	SLIST_FOREACH_SAFE(jmi, &jm->submgrs, sle, jmn) {
 		jobmgr_dispatch_all(jmi);
 	}
 
-	SLIST_FOREACH(ji, &jm->jobs, sle) {
+	SLIST_FOREACH_SAFE(ji, &jm->jobs, sle, jn) {
 		job_dispatch(ji, false);
 	}
 }
 
-void
+job_t
 job_dispatch(job_t j, bool kickstart)
 {
 	/*
@@ -1664,15 +1662,18 @@
 	 *
 	 * This is a classic example. The act of dispatching a job may delete it.
 	 */
-	if (job_active(j)) {
-		return;
-	} else if (job_useless(j)) {
-		job_remove(j);
-	} else if (kickstart || job_keepalive(j)) {
-		job_start(j);
-	} else {
-		job_watch(j);
+	if (!job_active(j)) {
+		if (job_useless(j)) {
+			job_remove(j);
+			return NULL;
+		} else if (kickstart || job_keepalive(j)) {
+			job_start(j);
+		} else {
+			job_watch(j);
+		}
 	}
+
+	return j;
 }
 
 void
@@ -3468,6 +3469,7 @@
 		}
 	}
 
+	/* We don't need the _SAFE version because we return after the job_dispatch() */
 	SLIST_FOREACH(ji, &jm->jobs, sle) {
 		SLIST_FOREACH(ms, &ji->machservices, sle) {
 			if (ms->port != p) {
@@ -3613,11 +3615,11 @@
 void
 jobmgr_dispatch_all_semaphores(jobmgr_t jm)
 {
-	jobmgr_t jmi;
+	jobmgr_t jmi, jmn;
 	job_t ji, jn;
 
 
-	SLIST_FOREACH(jmi, &jm->submgrs, sle) {
+	SLIST_FOREACH_SAFE(jmi, &jm->submgrs, sle, jmn) {
 		jobmgr_dispatch_all_semaphores(jmi);
 	}
 
@@ -3979,10 +3981,12 @@
 		ms->must_match_uid = true;
 		ms->hide = true;
 
-		job_dispatch(ji, false);
+		ji = job_dispatch(ji, false);
 	}
 
-	*up_cont = machservice_port(SLIST_FIRST(&ji->machservices));
+	if (job_assumes(j, ji != NULL)) {
+		*up_cont = machservice_port(SLIST_FIRST(&ji->machservices));
+	}
 
 	return 0;
 }
@@ -4538,8 +4542,12 @@
 	memcpy(jr->j_binpref, bin_pref, sizeof(jr->j_binpref));
 	jr->j_binpref_cnt = binpref_cnt;
 
-	job_dispatch(jr, true);
+	jr = job_dispatch(jr, true);
 
+	if (!job_assumes(j, jr != NULL)) {
+		return BOOTSTRAP_NO_MEMORY;
+	}
+
 	if (!job_setup_machport(jr)) {
 		job_remove(jr);
 		return BOOTSTRAP_NO_MEMORY;

Modified: trunk/launchd/src/launchd_core_logic.h
===================================================================
--- trunk/launchd/src/launchd_core_logic.h	2007-02-07 17:39:53 UTC (rev 23036)
+++ trunk/launchd/src/launchd_core_logic.h	2007-02-07 18:26:57 UTC (rev 23037)
@@ -43,7 +43,7 @@
 launch_data_t job_export_all(void);
 
 job_t job_new(jobmgr_t jm, const char *label, const char *prog, const char *const *argv, const char *stdinpath);
-void job_dispatch(job_t j, bool kickstart);
+job_t job_dispatch(job_t j, bool kickstart); /* returns j on success, NULL on job removal */
 bool job_active(job_t j);
 launch_data_t job_export(job_t j);
 void job_stop(job_t j);

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


More information about the launchd-changes mailing list