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

source_changes at macosforge.org source_changes at macosforge.org
Tue Mar 17 18:41:55 PDT 2009


Revision: 23863
          http://trac.macosforge.org/projects/launchd/changeset/23863
Author:   dsorresso at apple.com
Date:     2009-03-17 18:41:53 -0700 (Tue, 17 Mar 2009)
Log Message:
-----------
Embedded security fixes.

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

Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c	2009-03-17 22:24:19 UTC (rev 23862)
+++ trunk/launchd/src/launchd_core_logic.c	2009-03-18 01:41:53 UTC (rev 23863)
@@ -3507,16 +3507,16 @@
 	pid_t c;
 	bool sipc = false;
 	u_int proc_fflags = NOTE_EXIT|NOTE_FORK|NOTE_EXEC|NOTE_REAP;
-
+	
 	if (!job_assumes(j, j->mgr != NULL)) {
 		return;
 	}
-
+	
 	if (unlikely(job_active(j))) {
 		job_log(j, LOG_DEBUG, "Already started");
 		return;
 	}
-
+	
 	/*
 	 * Some users adjust the wall-clock and then expect software to not notice.
 	 * Therefore, launchd must use an absolute clock instead of the wall clock
@@ -3524,31 +3524,31 @@
 	 */
 	td = runtime_get_nanoseconds_since(j->start_time);
 	td /= NSEC_PER_SEC;
-
+	
 	if (j->start_time && (td < j->min_run_time) && !j->legacy_mach_job && !j->inetcompat) {
 		time_t respawn_delta = j->min_run_time - (uint32_t)td;
-
+		
 		/*
 		 * We technically should ref-count throttled jobs to prevent idle exit,
 		 * but we're not directly tracking the 'throttled' state at the moment.
 		 */
-
+		
 		job_log(j, LOG_WARNING, "Throttling respawn: Will start in %ld seconds", respawn_delta);
 		job_assumes(j, kevent_mod((uintptr_t)j, EVFILT_TIMER, EV_ADD|EV_ONESHOT, NOTE_SECONDS, respawn_delta, j) != -1);
 		job_ignore(j);
 		return;
 	}
-
+	
 	if (likely(!j->legacy_mach_job)) {
-		sipc = (!SLIST_EMPTY(&j->sockets) || !SLIST_EMPTY(&j->machservices));
+		sipc = ( !SLIST_EMPTY(&j->sockets) || !SLIST_EMPTY(&j->machservices) ) && !j->deny_job_creation;
 	}
 
 	if (sipc) {
 		job_assumes(j, socketpair(AF_UNIX, SOCK_STREAM, 0, spair) != -1);
 	}
-
+	
 	job_assumes(j, socketpair(AF_UNIX, SOCK_STREAM, 0, execspair) != -1);
-
+	
 	if (likely(!j->legacy_mach_job) && job_assumes(j, pipe(oepair) != -1)) {
 		j->log_redirect_fd = _fd(oepair[0]);
 		job_assumes(j, fcntl(j->log_redirect_fd, F_SETFL, O_NONBLOCK) != -1);
@@ -3584,7 +3584,7 @@
 		job_assumes(j, runtime_close(execspair[0]) == 0);
 		/* wait for our parent to say they've attached a kevent to us */
 		read(_fd(execspair[1]), &c, sizeof(c));
-
+		
 		if (sipc) {
 			job_assumes(j, runtime_close(spair[0]) == 0);
 			snprintf(nbuf, sizeof(nbuf), "%d", spair[1]);
@@ -3594,9 +3594,9 @@
 		break;
 	default:
 		j->start_time = runtime_get_opaque_time();
-
+		
 		job_log(j, LOG_DEBUG, "Started as PID: %u", c);
-
+		
 		j->checkedin = false;
 		j->start_pending = false;
 		j->reaped = false;
@@ -3617,7 +3617,7 @@
 		runtime_add_ref();
 		total_children++;
 		LIST_INSERT_HEAD(&j->mgr->active_jobs[ACTIVE_JOB_HASH(c)], j, pid_hash_sle);
-
+		
 		if (likely(!j->legacy_mach_job)) {
 			job_assumes(j, runtime_close(oepair[1]) != -1);
 		}
@@ -3638,7 +3638,7 @@
 		} else {
 			job_reap(j);
 		}
-
+		
 		if (likely(!j->stall_before_exec)) {
 			job_uncork_fork(j);
 		}
@@ -6676,7 +6676,7 @@
 		return BOOTSTRAP_NO_MEMORY;
 	}
 
-	if (unlikely(ldc->euid != 0 && ldc->euid != getuid())) {
+	if( unlikely(ldc->euid != 0 && ldc->euid != getuid()) || j->deny_job_creation ) {
 		return BOOTSTRAP_NOT_PRIVILEGED;
 	}
 
@@ -7221,6 +7221,10 @@
 		return BOOTSTRAP_NO_MEMORY;
 	}
 
+	if( j->deny_job_creation ) {
+		return BOOTSTRAP_NOT_PRIVILEGED;
+	}
+
 	ipc_server_init();
 
 	if (unlikely(!sockpath)) {
@@ -7329,6 +7333,11 @@
 	struct ldcred *ldc = runtime_get_caller_creds();
 	job_t jpu;
 	
+#if TARGET_OS_EMBEDDED
+	/* There is no need for per-user launchd's on embedded. */
+	return BOOTSTRAP_NOT_PRIVILEGED;
+#endif
+	
 	if (!launchd_assumes(j != NULL)) {
 		return BOOTSTRAP_NO_MEMORY;
 	}
@@ -7839,7 +7848,7 @@
 	kern_return_t kr = BOOTSTRAP_NOT_PRIVILEGED;
 	
 	mach_port_t _mp = MACH_PORT_NULL;
-	if( ldc->euid == 0 || ldc->euid == geteuid() ) {
+	if( !j->deny_job_creation && (ldc->euid == 0 || ldc->euid == geteuid()) ) {
 		job_t target_j = job_find(label);
 		if( jobmgr_assumes(root_jobmgr, target_j != NULL) ) {
 			if( target_j->j_port == MACH_PORT_NULL ) {

Modified: trunk/launchd/src/liblaunch.c
===================================================================
--- trunk/launchd/src/liblaunch.c	2009-03-17 22:24:19 UTC (rev 23862)
+++ trunk/launchd/src/liblaunch.c	2009-03-18 01:41:53 UTC (rev 23863)
@@ -190,12 +190,12 @@
 	name_t spath;
 	
 	_lc = calloc(1, sizeof(struct _launch_client));
-
+	
 	if (!_lc)
 		return;
-
+	
 	pthread_mutex_init(&_lc->mtx, NULL);
-
+	
 	if (_launchd_fd) {
 		lfd = strtol(_launchd_fd, NULL, 10);
 		if ((dfd = dup(lfd)) >= 0) {
@@ -248,7 +248,7 @@
 	if (!(_lc->async_resp = launch_data_alloc(LAUNCH_DATA_ARRAY))) {
 		goto out_bad;
 	}
-
+	
 	return;
 out_bad:
 	if (_lc->l)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/launchd-changes/attachments/20090317/581ab26f/attachment-0001.html>


More information about the launchd-changes mailing list