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

source_changes at macosforge.org source_changes at macosforge.org
Tue Jul 10 13:24:40 PDT 2007


Revision: 23299
          http://trac.macosforge.org/projects/launchd/changeset/23299
Author:   zarzycki at apple.com
Date:     2007-07-10 13:24:39 -0700 (Tue, 10 Jul 2007)

Log Message:
-----------
<rdar://problem/5318461> Bug: launchd_core_logic.c:3739 (23294):8: (errno = task_set_special_port(mach_task_self(), which_port, ms->port)) == KERN_SUCCESS

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-07-06 21:38:57 UTC (rev 23298)
+++ trunk/launchd/src/launchd_core_logic.c	2007-07-10 20:24:39 UTC (rev 23299)
@@ -121,16 +121,19 @@
 
 struct machservice {
 	SLIST_ENTRY(machservice) sle;
+	SLIST_ENTRY(machservice) special_port_sle;
 	LIST_ENTRY(machservice) name_hash_sle;
 	LIST_ENTRY(machservice) port_hash_sle;
 	job_t			job;
 	uint64_t		bad_perf_cnt;
 	unsigned int		gen_num;
 	mach_port_name_t	port;
-	unsigned int		isActive:1, reset:1, recv:1, hide:1, kUNCServer:1, per_user_hack:1, debug_on_close:1, per_pid:1;
+	unsigned int		isActive:1, reset:1, recv:1, hide:1, kUNCServer:1, per_user_hack:1, debug_on_close:1, per_pid:1, special_port_num:10;
 	const char		name[0];
 };
 
+static SLIST_HEAD(, machservice) special_ports; /* hack, this should be per jobmgr_t */
+
 #define PORT_HASH_SIZE 32
 #define HASH_PORT(x)	(IS_POWER_OF_TWO(PORT_HASH_SIZE) ? (MACH_PORT_INDEX(x) & (PORT_HASH_SIZE - 1)) : (MACH_PORT_INDEX(x) % PORT_HASH_SIZE))
 
@@ -3740,7 +3743,8 @@
 				job_log(ms->job, LOG_WARNING, "Tried to set a reserved task special port: %d", which_port);
 				break;
 			default:
-				job_assumes(ms->job, (errno = task_set_special_port(mach_task_self(), which_port, ms->port)) == KERN_SUCCESS);
+				ms->special_port_num = which_port;
+				SLIST_INSERT_HEAD(&special_ports, ms, special_port_sle);
 				break;
 			}
 		} else if (strcasecmp(key, LAUNCH_JOBKEY_MACH_HOSTSPECIALPORT) == 0 && getpid() == 1) {
@@ -4185,6 +4189,10 @@
 
 	job_log(j, LOG_INFO, "Mach service deleted%s: %s", port_died ? " (port died)" : "", ms->name);
 
+	if (ms->special_port_num) {
+		SLIST_REMOVE(&special_ports, ms, machservice, special_port_sle);
+	}
+
 	SLIST_REMOVE(&j->machservices, ms, machservice, sle);
 	LIST_REMOVE(ms, name_hash_sle);
 	LIST_REMOVE(ms, port_hash_sle);
@@ -5022,6 +5030,8 @@
 kern_return_t
 job_mig_post_fork_ping(job_t j, task_t child_task)
 {
+	struct machservice *ms;
+
 	if (!launchd_assumes(j != NULL)) {
 		return BOOTSTRAP_NO_MEMORY;
 	}
@@ -5030,6 +5040,14 @@
 
 	job_setup_exception_port(j, child_task);
 
+	SLIST_FOREACH(ms, &special_ports, special_port_sle) {
+		if (j->per_user && (ms->special_port_num != TASK_ACCESS_PORT)) {
+			/* The TASK_ACCESS_PORT funny business is to workaround 5325399. */
+			continue;
+		}
+		job_assumes(j, (errno = task_set_special_port(child_task, ms->special_port_num, ms->port)) == KERN_SUCCESS);
+	}
+
 	job_assumes(j, launchd_mport_deallocate(child_task) == KERN_SUCCESS);
 
 	return 0;

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


More information about the launchd-changes mailing list