Revision: 23299 http://trac.macosforge.org/projects/launchd/changeset/23299 Author: zarzycki@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;
participants (1)
-
source_changes@macosforge.org