Changeset 23255
- Timestamp:
- 05/17/07 14:07:38 (19 months ago)
- Location:
- trunk/launchd/src
- Files:
-
- 6 modified
-
launchctl.c (modified) (1 diff)
-
launchd_core_logic.c (modified) (10 diffs)
-
liblaunch.c (modified) (1 diff)
-
libvproc.c (modified) (4 diffs)
-
libvproc_internal.h (modified) (1 diff)
-
libvproc_private.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/launchd/src/launchctl.c
r23236 r23255 1930 1930 1931 1931 int 1932 list_cmd(int argc, char *const argv[] __attribute__((unused)))1932 list_cmd(int argc, char *const argv[]) 1933 1933 { 1934 1934 launch_data_t resp, msg; -
trunk/launchd/src/launchd_core_logic.c
r23254 r23255 245 245 unsigned int hopefully_first_cnt; 246 246 unsigned int normal_active_cnt; 247 unsigned int sent_stop_to_normal_jobs:1, sent_stop_to_hopefully_last_jobs:1, shutting_down:1 ;247 unsigned int sent_stop_to_normal_jobs:1, sent_stop_to_hopefully_last_jobs:1, shutting_down:1, session_initialized:1; 248 248 char name[0]; 249 249 }; … … 259 259 static void jobmgr_remove(jobmgr_t jm); 260 260 static void jobmgr_dispatch_all(jobmgr_t jm, bool newmounthack); 261 static job_t jobmgr_init_session(jobmgr_t jm, const char *session_type, bool sflag); 261 262 static job_t jobmgr_find_by_pid(jobmgr_t jm, pid_t p, bool create_anon); 262 263 static job_t job_mig_intran2(jobmgr_t jm, mach_port_t mport, pid_t upid); … … 3753 3754 jobmgr_new(jobmgr_t jm, mach_port_t requestorport, mach_port_t transfer_port, bool sflag, const char *name) 3754 3755 { 3755 const char *bootstrap_tool[] = { "/bin/launchctl", "bootstrap", "-S", name, NULL, NULL };3756 3756 mach_msg_size_t mxmsgsz; 3757 3757 job_t bootstrapper = NULL; 3758 3758 jobmgr_t jmr; 3759 3760 if (sflag) {3761 bootstrap_tool[4] = "-s";3762 }3763 3759 3764 3760 launchd_assert(offsetof(struct jobmgr_s, kqjobmgr_callback) == 0); … … 3837 3833 3838 3834 if (name) { 3839 char thelabel[1000]; 3840 3841 snprintf(thelabel, sizeof(thelabel), "com.apple.launchctl.%s", name); 3842 /* no name implies: bootstrap_subset() where creating a "bootstrapper" makes no sense */ 3843 bootstrapper = job_new(jmr, thelabel, NULL, bootstrap_tool); 3844 if (jobmgr_assumes(jmr, bootstrapper != NULL) && (jm || getuid())) { 3845 char buf[100]; 3846 3847 /* <rdar://problem/5042202> launchd-201: can't ssh in with AFP OD account (hangs) */ 3848 snprintf(buf, sizeof(buf), "0x%X:0:0", getuid()); 3849 envitem_new(bootstrapper, "__CF_USER_TEXT_ENCODING", buf, false); 3850 bootstrapper->weird_bootstrap = true; 3851 jobmgr_assumes(jmr, job_setup_machport(bootstrapper)); 3852 } 3835 bootstrapper = jobmgr_init_session(jmr, name, sflag); 3853 3836 } 3854 3837 … … 3872 3855 } 3873 3856 return NULL; 3857 } 3858 3859 job_t 3860 jobmgr_init_session(jobmgr_t jm, const char *session_type, bool sflag) 3861 { 3862 const char *bootstrap_tool[] = { "/bin/launchctl", "bootstrap", "-S", session_type, sflag ? "-s" : NULL, NULL }; 3863 char thelabel[1000]; 3864 job_t bootstrapper; 3865 3866 snprintf(thelabel, sizeof(thelabel), "com.apple.launchctl.%s", session_type); 3867 bootstrapper = job_new(jm, thelabel, NULL, bootstrap_tool); 3868 if (jobmgr_assumes(jm, bootstrapper != NULL) && (jm->parentmgr || getuid())) { 3869 char buf[100]; 3870 3871 /* <rdar://problem/5042202> launchd-201: can't ssh in with AFP OD account (hangs) */ 3872 snprintf(buf, sizeof(buf), "0x%X:0:0", getuid()); 3873 envitem_new(bootstrapper, "__CF_USER_TEXT_ENCODING", buf, false); 3874 bootstrapper->weird_bootstrap = true; 3875 jobmgr_assumes(jm, job_setup_machport(bootstrapper)); 3876 } 3877 3878 jm->session_initialized = true; 3879 3880 return bootstrapper; 3874 3881 } 3875 3882 … … 4872 4879 } 4873 4880 4881 job_log(j, LOG_DEBUG, "Looking up per user launchd for UID: %u", which_user); 4882 4883 runtime_get_caller_creds(&ldc); 4884 4874 4885 if (getpid() != 1) { 4886 job_log(j, LOG_ERR, "Only PID 1 supports per user launchd lookups."); 4875 4887 return BOOTSTRAP_NOT_PRIVILEGED; 4876 4888 } 4877 4878 runtime_get_caller_creds(&ldc);4879 4889 4880 4890 if (ldc.euid || ldc.uid) { 4881 4891 which_user = ldc.euid ? ldc.euid : ldc.uid; 4882 }4883 4884 if (which_user == 0) {4885 return BOOTSTRAP_NOT_PRIVILEGED;4886 4892 } 4887 4893 … … 4908 4914 char lbuf[1024]; 4909 4915 4916 job_log(j, LOG_DEBUG, "Creating per user launchd job for UID: %u", which_user); 4917 4910 4918 sprintf(lbuf, "com.apple.launchd.peruser.%u", which_user); 4911 4919 … … 4928 4936 4929 4937 ji = job_dispatch(ji, false); 4938 } else { 4939 job_log(j, LOG_DEBUG, "Per user launchd job found for UID: %u", which_user); 4930 4940 } 4931 4941 … … 5239 5249 mach_port_t reqport, rcvright; 5240 5250 kern_return_t kr = 1; 5251 struct ldcred ldc; 5241 5252 jobmgr_t jmr = NULL; 5242 job_t j2; 5243 5244 if (getuid() == 0) { 5245 const char *bootstrap_tool[] = { "/bin/launchctl", "bootstrap", "-S", session_type, NULL }; 5246 char thelabel[1000]; 5247 job_t bootstrapper; 5248 5249 snprintf(thelabel, sizeof(thelabel), "com.apple.launchctl.%s", session_type); 5250 5251 job_assumes(j, (j2 = job_mig_intran(target_subset)) != NULL); 5252 j = j2; 5253 5254 if (!launchd_assumes(j != NULL)) { 5255 return BOOTSTRAP_NO_MEMORY; 5256 } 5257 5258 runtime_get_caller_creds(&ldc); 5259 5260 if (target_subset == MACH_PORT_NULL) { 5261 job_t j2; 5262 5263 if (j->mgr->session_initialized) { 5264 job_log(j, LOG_ERR, "Tried to initialize an already setup session!"); 5265 kr = BOOTSTRAP_NOT_PRIVILEGED; 5266 goto out; 5267 } 5268 5253 5269 jobmgr_log(j->mgr, LOG_DEBUG, "Renaming to: %s", session_type); 5254 5270 strcpy(j->mgr->name, session_type); 5255 5271 5256 bootstrapper = job_new(j->mgr, thelabel, NULL, bootstrap_tool); 5257 if (job_assumes(j, bootstrapper != NULL)) { 5258 job_dispatch(bootstrapper, true); 5272 if (job_assumes(j, (j2 = jobmgr_init_session(j->mgr, session_type, false)))) { 5273 job_assumes(j, job_dispatch(j2, true)); 5259 5274 } 5260 5275 5261 5276 kr = 0; 5262 5277 goto out; 5263 } 5264 5265 /* We call job_mig_intran2 because job_mig_intran logs on failure */ 5266 if (getpid() != 1 && job_mig_intran2(root_jobmgr, target_subset, getpid())) { 5267 kr = 0; 5278 } else if (job_mig_intran2(root_jobmgr, target_subset, ldc.pid)) { 5279 job_log(j, LOG_ERR, "Moving a session to ourself is bogus."); 5280 5281 kr = BOOTSTRAP_NOT_PRIVILEGED; 5268 5282 goto out; 5269 5283 } 5270 5284 5271 if (!job_assumes(j, (kr = _vproc_grab_subset(target_subset, &reqport, &rcvright, &l2l_names, &l2l_name_cnt, &l2l_pids, &l2l_pid_cnt, &l2l_ports, &l2l_port_cnt)) == 0)) { 5285 job_log(j, LOG_DEBUG, "Move subset attempt: 0x%x", target_subset); 5286 5287 kr = _vproc_grab_subset(target_subset, &reqport, &rcvright, &l2l_names, &l2l_name_cnt, &l2l_pids, &l2l_pid_cnt, &l2l_ports, &l2l_port_cnt); 5288 5289 if (!job_assumes(j, kr == 0)) { 5272 5290 goto out; 5273 5291 } … … 5309 5327 5310 5328 if (kr == 0) { 5311 job_assumes(j, launchd_mport_deallocate(target_subset) == KERN_SUCCESS); 5329 if (target_subset) { 5330 job_assumes(j, launchd_mport_deallocate(target_subset) == KERN_SUCCESS); 5331 } 5312 5332 } else if (jmr) { 5313 5333 jobmgr_shutdown(jmr); -
trunk/launchd/src/liblaunch.c
r23235 r23255 1205 1205 load_launchd_jobs_at_loginwindow_prompt(int flags __attribute__((unused)), ...) 1206 1206 { 1207 _vprocmgr_ move_subset_to_user(geteuid() ? geteuid() : getuid(),"LoginWindow");1207 _vprocmgr_init("LoginWindow"); 1208 1208 } 1209 1209 -
trunk/launchd/src/libvproc.c
r23249 r23255 31 31 #include <errno.h> 32 32 #include <unistd.h> 33 #include <syslog.h> 33 34 34 35 #include "liblaunch_public.h" … … 66 67 67 68 vproc_err_t 68 _vprocmgr_move_subset_to_user(uid_t target_user, char *session_type) 69 _vprocmgr_init(const char *session_type) 70 { 71 if (vproc_mig_move_subset(bootstrap_port, MACH_PORT_NULL, (char *)session_type) == 0) { 72 return NULL; 73 } 74 75 return (vproc_err_t)_vprocmgr_init; 76 } 77 78 vproc_err_t 79 _vprocmgr_move_subset_to_user(uid_t target_user, const char *session_type) 69 80 { 70 81 launch_data_t output_obj; 71 82 kern_return_t kr = 1; 72 mach_port_t puc = 0, which_port = bootstrap_port;83 mach_port_t puc = 0, rootbs = get_root_bootstrap_port(); 73 84 bool is_bkgd = (strcmp(session_type, VPROCMGR_SESSION_BACKGROUND) == 0); 74 75 if (target_user && vproc_mig_lookup_per_user_context(get_root_bootstrap_port(), target_user, &puc) == 0) { 76 which_port = puc; 85 int64_t ldpid, lduid; 86 87 if (vproc_swap_integer(NULL, VPROC_GSK_MGR_PID, 0, &ldpid) != 0) { 88 return (vproc_err_t)_vprocmgr_move_subset_to_user; 89 } 90 91 if (vproc_swap_integer(NULL, VPROC_GSK_MGR_UID, 0, &lduid) != 0) { 92 return (vproc_err_t)_vprocmgr_move_subset_to_user; 93 } 94 95 if (target_user == 0) { 96 if (ldpid == 1 && rootbs != bootstrap_port) { 97 return _vprocmgr_init(session_type); 98 } 99 100 task_set_bootstrap_port(mach_task_self(), rootbs); 101 mach_port_deallocate(mach_task_self(), bootstrap_port); 102 bootstrap_port = rootbs; 103 104 return NULL; 105 } 106 107 if (ldpid != 1) { 108 if (lduid == getuid()) { 109 return NULL; 110 } 111 /* 112 * Not all sessions can be moved. 113 * We should clean up this mess someday. 114 */ 115 return (vproc_err_t)_vprocmgr_move_subset_to_user; 116 } 117 118 if (vproc_mig_lookup_per_user_context(rootbs, target_user, &puc) != 0) { 119 return (vproc_err_t)_vprocmgr_move_subset_to_user; 77 120 } 78 121 … … 80 123 kr = 0; 81 124 } else { 82 kr = vproc_mig_move_subset( which_port, bootstrap_port,session_type);83 } 84 85 if ( puc &&is_bkgd) {125 kr = vproc_mig_move_subset(puc, bootstrap_port, (char *)session_type); 126 } 127 128 if (is_bkgd) { 86 129 task_set_bootstrap_port(mach_task_self(), puc); 87 130 mach_port_deallocate(mach_task_self(), bootstrap_port); 88 131 bootstrap_port = puc; 89 } else if (puc){132 } else { 90 133 mach_port_deallocate(mach_task_self(), puc); 91 134 } … … 309 352 do { 310 353 if (previous_port) { 311 mach_port_deallocate(mach_task_self(), previous_port); 354 if (previous_port != bootstrap_port) { 355 mach_port_deallocate(mach_task_self(), previous_port); 356 } 312 357 previous_port = parent_port; 313 358 } else { -
trunk/launchd/src/libvproc_internal.h
r23208 r23255 40 40 #pragma GCC visibility push(default) 41 41 42 vproc_err_t _vprocmgr_init(const char *session_type); 42 43 vproc_err_t _vproc_post_fork_ping(void); 43 44 -
trunk/launchd/src/libvproc_private.h
r23235 r23255 64 64 #define VPROCMGR_SESSION_SYSTEM "System" 65 65 66 vproc_err_t _vprocmgr_move_subset_to_user(uid_t target_user, c har *session_type);66 vproc_err_t _vprocmgr_move_subset_to_user(uid_t target_user, const char *session_type); 67 67 68 68 #pragma GCC visibility pop

