[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