Revision
23005
Author
zarzycki@apple.com
Date
2007-01-04 17:14:23 -0800 (Thu, 04 Jan 2007)

Log Message

<rdar://problem/4857011> Unable to drag & drop, copy & paste when logged in as root.

Modified Paths

Diff

Modified: trunk/launchd/src/launchd_core_logic.c (23004 => 23005)


--- trunk/launchd/src/launchd_core_logic.c	2007-01-05 00:11:52 UTC (rev 23004)
+++ trunk/launchd/src/launchd_core_logic.c	2007-01-05 01:14:23 UTC (rev 23005)
@@ -4195,6 +4195,13 @@
 	kern_return_t kr;
 	jobmgr_t jmr;
 
+	if (getuid() == 0) {
+		j = job_mig_intran2(root_jobmgr, target_subset);
+		job_assumes(j, launchd_mport_deallocate(target_subset) == KERN_SUCCESS);
+		strcpy(j->mgr->name, "Aqua");
+		return 0;
+	}
+
 	kr = _vproc_grab_subset(target_subset, &reqport,
 			&rcvright, &l2l_names, &l2l_name_cnt, &l2l_ports, &l2l_port_cnt);
 

Modified: trunk/launchd/src/libvproc.c (23004 => 23005)


--- trunk/launchd/src/libvproc.c	2007-01-05 00:11:52 UTC (rev 23004)
+++ trunk/launchd/src/libvproc.c	2007-01-05 01:14:23 UTC (rev 23005)
@@ -29,6 +29,7 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <errno.h>
+#include <unistd.h>
 
 #include "liblaunch_public.h"
 #include "liblaunch_private.h"
@@ -47,10 +48,15 @@
 _vproc_move_subset_to_user(void)
 {
 	kern_return_t kr = 1;
-	mach_port_t puc;
+	mach_port_t puc = 0, which_port = bootstrap_port;
 
-	if (vproc_mig_lookup_per_user_context(bootstrap_port, 0, &puc) == 0) {
-		kr = vproc_mig_move_subset_to_user(puc, bootstrap_port);
+	if ((getuid() || geteuid()) && vproc_mig_lookup_per_user_context(bootstrap_port, 0, &puc) == 0) {
+		which_port = puc;
+	}
+
+	kr = vproc_mig_move_subset_to_user(which_port, bootstrap_port);
+
+	if (puc) {
 		mach_port_deallocate(mach_task_self(), puc);
 	}