[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