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

source_changes at macosforge.org source_changes at macosforge.org
Tue May 22 13:08:55 PDT 2007


Revision: 23260
          http://trac.macosforge.org/projects/launchd/changeset/23260
Author:   zarzycki at apple.com
Date:     2007-05-22 13:08:55 -0700 (Tue, 22 May 2007)

Log Message:
-----------
<rdar://problem/5158497> bootstrap_set_policy: policy should be inherited

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-05-22 20:03:44 UTC (rev 23259)
+++ trunk/launchd/src/launchd_core_logic.c	2007-05-22 20:08:55 UTC (rev 23260)
@@ -107,7 +107,8 @@
 	const char		name[0];
 };
 
-static bool mspolicy_new(job_t j, const char *name, bool allow, bool pid_local);
+static bool mspolicy_new(job_t j, const char *name, bool allow, bool pid_local, bool skip_check);
+static bool mspolicy_copy(job_t j_to, job_t j_from);
 static void mspolicy_setup(launch_data_t obj, const char *key, void *context);
 static bool mspolicy_check(job_t j, const char *name, bool pid_local);
 static void mspolicy_delete(job_t j, struct mspolicy *msp);
@@ -977,19 +978,28 @@
 job_new_anonymous(jobmgr_t jm, pid_t anonpid)
 {
 	int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, anonpid };
-	struct kinfo_proc kp, ppid_kp;
+	struct kinfo_proc kp;
 	size_t len = sizeof(kp);
 	bool shutdown_state;
-	job_t jr = NULL;
+	job_t jp = NULL, jr = NULL;
 
 	if (!jobmgr_assumes(jm, sysctl(mib, 4, &kp, &len, NULL, 0) != -1)) {
 		return NULL;
 	}
 
-	mib[3] = kp.kp_eproc.e_ppid;
-
-	if (!jobmgr_assumes(jm, sysctl(mib, 4, &ppid_kp, &len, NULL, 0) != -1)) {
-		return NULL;
+	switch (kp.kp_eproc.e_ppid) {
+	case 0:
+		/* the kernel */
+		break;
+	case 1:
+		if (getpid() != 1) {
+			break;
+		}
+		/* fall through */
+	default:
+		jp = jobmgr_find_by_pid(jm, kp.kp_eproc.e_ppid, true);
+		jobmgr_assumes(jm, jp != NULL);
+		break;
 	}
 
 	/* A total hack: Normally, job_new() returns an error during shutdown, but anonymous jobs are special. */
@@ -1003,14 +1013,20 @@
 		total_children++;
 		jr->anonymous = true;
 		jr->p = anonpid;
+
 		/* anonymous process reaping is messy */
 		LIST_INSERT_HEAD(&jm->active_jobs[ACTIVE_JOB_HASH(jr->p)], jr, pid_hash_sle);
 		job_assumes(jr, kevent_mod(jr->p, EVFILT_PROC, EV_ADD, proc_fflags, 0, root_jobmgr) != -1);
+
+		if (jp) {
+			job_assumes(jr, mspolicy_copy(jr, jp));
+		}
+
 		if (shutdown_state && jm->hopefully_first_cnt == 0) {
-			job_log(jr, LOG_APPLEONLY, "This process showed up to the party while all the guests were leaving. Odds are that it will have a miserable time. Blame PID %u: %s",
-				kp.kp_eproc.e_ppid, ppid_kp.kp_proc.p_comm);
+			job_log(jr, LOG_APPLEONLY, "This process showed up to the party while all the guests were leaving. Odds are that it will have a miserable time.");
 		}
-		job_log(jr, LOG_DEBUG, "Created anonymously by PPID %u: %s", kp.kp_eproc.e_ppid, ppid_kp.kp_proc.p_comm);
+
+		job_log(jr, LOG_DEBUG, "Created anonymously by PPID %u%s%s", kp.kp_eproc.e_ppid, jp ? ": " : "", jp ? jp->label : "");
 	}
 
 	if (shutdown_state) {
@@ -5572,7 +5588,7 @@
 	if (SLIST_EMPTY(&j->mspolicies)) {
 		job_log(j, LOG_DEBUG, "Setting policy on job \"%s\" for Mach service: %s", target_j->label, target_service);
 		if (target_service[0]) {
-			job_assumes(j, mspolicy_new(target_j, target_service, flags & BOOTSTRAP_ALLOW_LOOKUP, flags & BOOTSTRAP_PER_PID_SERVICE));
+			job_assumes(j, mspolicy_new(target_j, target_service, flags & BOOTSTRAP_ALLOW_LOOKUP, flags & BOOTSTRAP_PER_PID_SERVICE, false));
 		} else {
 			target_j->deny_unknown_mslookups = !(flags & BOOTSTRAP_ALLOW_LOOKUP);
 		}
@@ -5709,11 +5725,25 @@
 }
 
 bool
-mspolicy_new(job_t j, const char *name, bool allow, bool pid_local)
+mspolicy_copy(job_t j_to, job_t j_from)
 {
 	struct mspolicy *msp;
 
-	SLIST_FOREACH(msp, &j->mspolicies, sle) {
+	SLIST_FOREACH(msp, &j_from->mspolicies, sle) {
+		if (!mspolicy_new(j_to, msp->name, msp->allow, msp->per_pid, true)) {
+			return false;
+		}
+	}
+
+	return true;
+}
+
+bool
+mspolicy_new(job_t j, const char *name, bool allow, bool pid_local, bool skip_check)
+{
+	struct mspolicy *msp;
+
+	if (!skip_check) SLIST_FOREACH(msp, &j->mspolicies, sle) {
 		if (msp->per_pid != pid_local) {
 			continue;
 		} else if (strcmp(msp->name, name) == 0) {
@@ -5727,6 +5757,7 @@
 
 	strcpy((char *)msp->name, name);
 	msp->per_pid = pid_local;
+	msp->allow = allow;
 
 	SLIST_INSERT_HEAD(&j->mspolicies, msp, sle);
 
@@ -5743,7 +5774,7 @@
 		return;
 	}
 
-	job_assumes(j, mspolicy_new(j, key, launch_data_get_bool(obj), false));
+	job_assumes(j, mspolicy_new(j, key, launch_data_get_bool(obj), false, false));
 }
 
 bool

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


More information about the launchd-changes mailing list