[launchd-changes] [23208] trunk/launchd/src
source_changes at macosforge.org
source_changes at macosforge.org
Thu Apr 5 16:26:16 PDT 2007
Revision: 23208
http://trac.macosforge.org/projects/launchd/changeset/23208
Author: zarzycki at apple.com
Date: 2007-04-05 16:26:16 -0700 (Thu, 05 Apr 2007)
Log Message:
-----------
Let's be smarter about post fork() behavior and how we setup the Mach exception port.
Modified Paths:
--------------
trunk/launchd/src/launchd_core_logic.c
trunk/launchd/src/libvproc.c
trunk/launchd/src/libvproc_internal.h
trunk/launchd/src/protocol_job.defs
trunk/launchd/src/protocol_job_reply.defs
Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c 2007-04-05 21:14:11 UTC (rev 23207)
+++ trunk/launchd/src/launchd_core_logic.c 2007-04-05 23:26:16 UTC (rev 23208)
@@ -352,6 +352,7 @@
static void job_postfork_become_user(job_t j);
static void job_find_and_blame_pids_with_weird_uids(job_t j);
static void job_force_sampletool(job_t j);
+static void job_setup_exception_port(job_t j, task_t target_task);
static void job_reparent_hack(job_t j, const char *where);
static void job_callback(void *obj, struct kevent *kev);
static void job_callback_proc(job_t j, int flags, int fflags);
@@ -400,6 +401,8 @@
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));
+static mach_port_t the_exception_server;
+
jobmgr_t root_jobmgr;
void
@@ -2153,6 +2156,9 @@
}
break;
case 0:
+ if (_vproc_post_fork_ping()) {
+ _exit(EXIT_FAILURE);
+ }
if (!j->legacy_mach_job) {
job_assumes(j, dup2(oepair[1], STDOUT_FILENO) != -1);
job_assumes(j, dup2(oepair[1], STDERR_FILENO) != -1);
@@ -3359,16 +3365,15 @@
}
void
-machservice_setup_options(launch_data_t obj, const char *key, void *context)
+job_setup_exception_port(job_t j, task_t target_task)
{
- struct machservice *ms = context;
- mach_port_t mhp = mach_host_self();
- mach_port_t mts = mach_task_self();
thread_state_flavor_t f = 0;
exception_mask_t em;
- int which_port;
- bool b;
+ if (!the_exception_server) {
+ return;
+ }
+
#if defined (__ppc__)
f = PPC_THREAD_STATE64;
#elif defined(__i386__)
@@ -3381,6 +3386,19 @@
em = EXC_MASK_RPC_ALERT;
#endif
+ job_assumes(j, task_set_exception_ports(target_task, em, the_exception_server,
+ EXCEPTION_STATE_IDENTITY | MACH_EXCEPTION_CODES, f) == KERN_SUCCESS);
+
+}
+
+void
+machservice_setup_options(launch_data_t obj, const char *key, void *context)
+{
+ struct machservice *ms = context;
+ mach_port_t mhp = mach_host_self();
+ int which_port;
+ bool b;
+
if (!job_assumes(ms->job, mhp != MACH_PORT_NULL)) {
return;
}
@@ -3399,7 +3417,7 @@
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(mts, which_port, ms->port)) == KERN_SUCCESS);
+ job_assumes(ms->job, (errno = task_set_special_port(mach_task_self(), which_port, ms->port)) == KERN_SUCCESS);
break;
}
} else if (strcasecmp(key, LAUNCH_JOBKEY_MACH_HOSTSPECIALPORT) == 0 && getpid() == 1) {
@@ -3418,20 +3436,22 @@
} else if (strcasecmp(key, LAUNCH_JOBKEY_MACH_HIDEUNTILCHECKIN) == 0) {
ms->hide = b;
} else if (strcasecmp(key, LAUNCH_JOBKEY_MACH_EXCEPTIONSERVER) == 0) {
- job_assumes(ms->job, task_set_exception_ports(mts, em, ms->port,
- EXCEPTION_STATE_IDENTITY, f) == KERN_SUCCESS);
+ if (!the_exception_server) {
+ the_exception_server = ms->port;
+ } else {
+ job_log(ms->job, LOG_WARNING, "The exception server is already claimed!");
+ }
} else if (strcasecmp(key, LAUNCH_JOBKEY_MACH_KUNCSERVER) == 0) {
ms->kUNCServer = b;
job_assumes(ms->job, host_set_UNDServer(mhp, ms->port) == KERN_SUCCESS);
}
break;
case LAUNCH_DATA_DICTIONARY:
-#ifdef MACH_EXCEPTION_CODES
- if (strcasecmp(key, LAUNCH_JOBKEY_MACH_EXCEPTIONSERVER) == 0) {
- job_assumes(ms->job, task_set_exception_ports(mts, em, ms->port,
- EXCEPTION_STATE_IDENTITY | MACH_EXCEPTION_CODES, f) == KERN_SUCCESS);
+ if (!the_exception_server) {
+ the_exception_server = ms->port;
+ } else {
+ job_log(ms->job, LOG_WARNING, "The exception server is already claimed!");
}
-#endif
break;
default:
break;
@@ -4458,6 +4478,22 @@
}
kern_return_t
+job_mig_post_fork_ping(job_t j, task_t child_task)
+{
+ if (!launchd_assumes(j != NULL)) {
+ return BOOTSTRAP_NO_MEMORY;
+ }
+
+ job_log(j, LOG_DEBUG, "Post fork ping.");
+
+ job_setup_exception_port(j, child_task);
+
+ job_assumes(j, launchd_mport_deallocate(child_task) == KERN_SUCCESS);
+
+ return 0;
+}
+
+kern_return_t
job_mig_reboot2(job_t j, uint64_t flags)
{
char who_started_the_reboot[2048] = "";
Modified: trunk/launchd/src/libvproc.c
===================================================================
--- trunk/launchd/src/libvproc.c 2007-04-05 21:14:11 UTC (rev 23207)
+++ trunk/launchd/src/libvproc.c 2007-04-05 23:26:16 UTC (rev 23208)
@@ -52,6 +52,12 @@
}
vproc_err_t
+_vproc_post_fork_ping(void)
+{
+ return vproc_mig_post_fork_ping(bootstrap_port, mach_task_self()) == 0 ? NULL : _vproc_post_fork_ping;
+}
+
+vproc_err_t
_vprocmgr_move_subset_to_user(uid_t target_user, char *session_type)
{
kern_return_t kr = 1;
Modified: trunk/launchd/src/libvproc_internal.h
===================================================================
--- trunk/launchd/src/libvproc_internal.h 2007-04-05 21:14:11 UTC (rev 23207)
+++ trunk/launchd/src/libvproc_internal.h 2007-04-05 23:26:16 UTC (rev 23208)
@@ -39,6 +39,8 @@
#pragma GCC visibility push(default)
+vproc_err_t _vproc_post_fork_ping(void);
+
#define SPAWN_HAS_PATH 0x0001
#define SPAWN_HAS_WDIR 0x0002
#define SPAWN_HAS_UMASK 0x0004
Modified: trunk/launchd/src/protocol_job.defs
===================================================================
--- trunk/launchd/src/protocol_job.defs 2007-04-05 21:14:11 UTC (rev 23207)
+++ trunk/launchd/src/protocol_job.defs 2007-04-05 23:26:16 UTC (rev 23208)
@@ -74,7 +74,9 @@
__bs_port : job_t;
out __parent_port : mach_port_send_t);
-skip; /* last used in 10.4 */
+routine post_fork_ping(
+ __bs_port : job_t;
+ __task_port : task_t);
routine info(
__bs_port : job_t;
Modified: trunk/launchd/src/protocol_job_reply.defs
===================================================================
--- trunk/launchd/src/protocol_job_reply.defs 2007-04-05 21:14:11 UTC (rev 23207)
+++ trunk/launchd/src/protocol_job_reply.defs 2007-04-05 23:26:16 UTC (rev 23208)
@@ -41,7 +41,7 @@
skip; /* parent */
-skip;
+skip; /* post_fork_ping */
skip; /* info */
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070405/978b98be/attachment.html
More information about the launchd-changes
mailing list