[launchd-changes] [23284] trunk/launchd/src/launchd_core_logic.c

source_changes at macosforge.org source_changes at macosforge.org
Thu Jun 28 15:12:18 PDT 2007


Revision: 23284
          http://trac.macosforge.org/projects/launchd/changeset/23284
Author:   zarzycki at apple.com
Date:     2007-06-28 15:12:17 -0700 (Thu, 28 Jun 2007)

Log Message:
-----------
<rdar://problem/5288435> kinit fails with Internal credentials cache error when run by root user

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

Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c	2007-06-20 20:19:32 UTC (rev 23283)
+++ trunk/launchd/src/launchd_core_logic.c	2007-06-28 22:12:17 UTC (rev 23284)
@@ -427,6 +427,7 @@
 static bool cronemu_min(struct tm *wtm, int min);
 
 static unsigned int total_children;
+static void ensure_root_bkgd_setup(void);
 static int dir_has_files(job_t j, const char *path);
 static char **mach_cmd2argv(const char *string);
 static size_t our_strhash(const char *s) __attribute__((pure));
@@ -434,6 +435,7 @@
 static bool did_first_per_user_launchd_BootCache_hack;
 
 jobmgr_t root_jobmgr;
+static jobmgr_t background_jobmgr;
 
 void
 job_ignore(job_t j)
@@ -674,6 +676,10 @@
 		jobmgr_assumes(jm, launchd_mport_close_recv(jm->jm_port) == KERN_SUCCESS);
 	}
 
+	if (jm == background_jobmgr) {
+		background_jobmgr = NULL;
+	}
+
 	if (jm->parentmgr) {
 		SLIST_REMOVE(&jm->parentmgr->submgrs, jm, jobmgr_s, sle);
 	} else if (getpid() == 1) {
@@ -5052,6 +5058,21 @@
 	return 0;
 }
 
+void
+ensure_root_bkgd_setup(void)
+{
+	if (background_jobmgr || getpid() != 1) {
+		return;
+	}
+
+	if (!jobmgr_assumes(root_jobmgr, (background_jobmgr = jobmgr_new(root_jobmgr, mach_task_self(), MACH_PORT_NULL, false, VPROCMGR_SESSION_BACKGROUND)) != NULL)) {
+		return;
+	}
+
+	background_jobmgr->req_port = 0;
+	jobmgr_assumes(root_jobmgr, launchd_mport_make_send(background_jobmgr->jm_port) == KERN_SUCCESS);
+}
+
 kern_return_t
 job_mig_lookup_per_user_context(job_t j, uid_t which_user, mach_port_t *up_cont)
 {
@@ -5077,6 +5098,14 @@
 
 	*up_cont = MACH_PORT_NULL;
 
+	if (which_user == 0) {
+		ensure_root_bkgd_setup();
+
+		*up_cont = background_jobmgr->jm_port;
+
+		return 0;
+	}
+
 	LIST_FOREACH(ji, &root_jobmgr->jobs, sle) {
 		if (!ji->per_user) {
 			continue;
@@ -5393,14 +5422,18 @@
 {
 	jobmgr_t jmi = NULL;
 
+	ensure_root_bkgd_setup();
+
 	/* NULL is only passed for our custom API for LaunchServices. If that is the case, we do magic. */
 	if (where == NULL) {
-		if (strcasecmp(j->mgr->name, "LoginWindow") == 0) {
-			where = "LoginWindow";
+		if (strcasecmp(j->mgr->name, VPROCMGR_SESSION_LOGINWINDOW) == 0) {
+			where = VPROCMGR_SESSION_LOGINWINDOW;
 		} else {
-			where = "Aqua";
+			where = VPROCMGR_SESSION_AQUA;
 		}
-	} else if (strcasecmp(where, "Aqua") != 0 && strcasecmp(where, "LoginWindow") != 0) {
+	} else if (strcasecmp(where, VPROCMGR_SESSION_AQUA) != 0
+			&& strcasecmp(where, VPROCMGR_SESSION_LOGINWINDOW) != 0
+			&& strcasecmp(where, VPROCMGR_SESSION_BACKGROUND) != 0) {
 		return;
 	}
 
@@ -5461,6 +5494,13 @@
 							job_remove(ji);
 						}
 					}
+
+					ensure_root_bkgd_setup();
+
+					SLIST_REMOVE(&j->mgr->parentmgr->submgrs, j->mgr, jobmgr_s, sle);
+					j->mgr->parentmgr = background_jobmgr;
+					SLIST_INSERT_HEAD(&j->mgr->parentmgr->submgrs, j->mgr, sle);
+
 				} else if (strcmp(j->mgr->name, VPROCMGR_SESSION_AQUA) == 0) {
 					return 0;
 				} else {
@@ -5890,7 +5930,9 @@
 void
 jobmgr_init(bool sflag)
 {
-	launchd_assert((root_jobmgr = jobmgr_new(NULL, MACH_PORT_NULL, MACH_PORT_NULL, sflag, getpid() == 1 ? "System" : "Background")) != NULL);
+	const char *root_session_type = getpid() == 1 ? VPROCMGR_SESSION_SYSTEM : VPROCMGR_SESSION_BACKGROUND;
+
+	launchd_assert((root_jobmgr = jobmgr_new(NULL, MACH_PORT_NULL, MACH_PORT_NULL, sflag, root_session_type)) != NULL);
 }
 
 size_t

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


More information about the launchd-changes mailing list