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

source_changes at macosforge.org source_changes at macosforge.org
Tue Mar 24 10:50:42 PDT 2009


Revision: 23864
          http://trac.macosforge.org/projects/launchd/changeset/23864
Author:   dsorresso at apple.com
Date:     2009-03-24 10:50:41 -0700 (Tue, 24 Mar 2009)
Log Message:
-----------
<rdar://problem/6682029> 10A295: rpc.statd launchd job submission succeeds but returns EACCES?

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

Modified: trunk/launchd/src/launchctl.c
===================================================================
--- trunk/launchd/src/launchctl.c	2009-03-18 01:41:53 UTC (rev 23863)
+++ trunk/launchd/src/launchctl.c	2009-03-24 17:50:41 UTC (rev 23864)
@@ -2410,6 +2410,8 @@
 					case ESRCH:
 						fprintf(stderr, "%s: %s\n", lab4job, "Not loaded");
 						break;
+					case ENEEDAUTH:
+						fprintf(stderr, "%s: %s\n", lab4job, "Could not set security session");
 					default:
 						fprintf(stderr, "%s: %s\n", lab4job, strerror(e));
 					case 0:

Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c	2009-03-18 01:41:53 UTC (rev 23863)
+++ trunk/launchd/src/launchd_core_logic.c	2009-03-24 17:50:41 UTC (rev 23864)
@@ -1562,6 +1562,10 @@
 		return NULL;
 	}
 
+	/* Since jobs are effectively stalled until they get security sessions assigned
+	 * to them, we may wish to reconsider this behavior of calling the job "enabled"
+	 * as far as other jobs with the OtherJobEnabled KeepAlive criterion set.
+	 */
 	job_dispatch_curious_jobs(j);
 	return job_dispatch(j, false);
 }
@@ -1576,7 +1580,7 @@
 	ja = alloca(c * sizeof(job_t));
 
 	for (i = 0; i < c; i++) {
-		if (likely(ja[i] = jobmgr_import2(root_jobmgr, launch_data_array_get_index(pload, i)))) {
+		if( (likely(ja[i] = jobmgr_import2(root_jobmgr, launch_data_array_get_index(pload, i)))) && errno != ENEEDAUTH ) {
 			errno = 0;
 		}
 		launch_data_array_set_index(resp, launch_data_new_errno(errno), i);
@@ -2251,6 +2255,7 @@
 			uuid_unparse(j->expected_audit_uuid, uuid_str);
 			job_log(j, LOG_DEBUG, "Imported job. Waiting for session for UUID %s.", uuid_str);
 			LIST_INSERT_HEAD(&s_needing_sessions, j, needing_session_sle);
+			errno = ENEEDAUTH;
 		} else {
 			job_log(j, LOG_DEBUG, "No security session specified.");
 			j->audit_session = MACH_PORT_NULL;

Modified: trunk/launchd/src/liblaunch.c
===================================================================
--- trunk/launchd/src/liblaunch.c	2009-03-18 01:41:53 UTC (rev 23863)
+++ trunk/launchd/src/liblaunch.c	2009-03-24 17:50:41 UTC (rev 23864)
@@ -982,6 +982,10 @@
 	}
 
 	pthread_once(&_lc_once, launch_client_init);
+	if (!_lc) {
+		errno = ENOTCONN;
+		return NULL;
+	}
 
 #if !TARGET_OS_EMBEDDED
 	uuid_t uuid;
@@ -1023,11 +1027,6 @@
 	}
 #endif
 
-	if (!_lc) {
-		errno = ENOTCONN;
-		return NULL;
-	}
-
 	pthread_mutex_lock(&_lc->mtx);
 
 	if (d && launchd_msg_send(_lc->l, d) == -1) {
@@ -1061,22 +1060,38 @@
 out:
 #if !TARGET_OS_EMBEDDED
 	if( !uuid_is_null(uuid) && resp && jobs_that_need_sessions > 0 ) {
-		mach_port_t session = MACH_PORT_NULL;
-		if( (launch_data_get_type(resp) == LAUNCH_DATA_ERRNO && launch_data_get_errno(resp) == 0) || launch_data_get_type(resp) == LAUNCH_DATA_ARRAY ) {
-			session = _audit_session_self();
+		mach_port_t session_port = _audit_session_self();
+		launch_data_type_t resp_type = launch_data_get_type(resp);
+		
+		bool set_session = false;
+		if( resp_type == LAUNCH_DATA_ERRNO ) {
+			set_session = ( launch_data_get_errno(resp) == ENEEDAUTH );
+		} else if( resp_type == LAUNCH_DATA_ARRAY ) {
+			set_session = true;
 		}
-
+		
 		kern_return_t kr = KERN_FAILURE;
+		if( set_session ) {
+			kr = vproc_mig_set_security_session(bootstrap_port, uuid, session_port);
+		}
 		
-		/* If we can't get our own session, set the sessions for our recently-submitted jobs
-		 * to MACH_PORT_NULL.
-		 */
-		kr = vproc_mig_set_security_session(bootstrap_port, uuid, session);
-		
-		if( kr != KERN_SUCCESS || session == MACH_PORT_NULL ) {
-			launch_data_set_errno(resp, EACCES);
-			_vproc_log_error(LOG_WARNING, "Could not set security session for recently submitted jobs!");
+		if( kr == KERN_SUCCESS ) {
+			if( resp_type == LAUNCH_DATA_ERRNO ) {
+				launch_data_set_errno(resp, 0);
+			} else {
+				size_t i = 0;
+				for( i = 0; i < launch_data_array_get_count(resp); i++ ) {
+					launch_data_t ri = launch_data_array_get_index(resp, i);
+					
+					int recvd_err = 0;
+					if( launch_data_get_type(ri) == LAUNCH_DATA_ERRNO && (recvd_err = launch_data_get_errno(ri)) ) {
+						launch_data_set_errno(ri, recvd_err == ENEEDAUTH ? 0 : recvd_err);
+					}
+				}
+			}
 		}
+
+		mach_port_deallocate(mach_task_self(), session_port);
 	}
 #endif
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/launchd-changes/attachments/20090324/09b6a69a/attachment.html>


More information about the launchd-changes mailing list