Projects
Browse Source     Search     Timeline     Wiki

Changeset 23255

Show
Ignore:
Timestamp:
05/17/07 14:07:38 (19 months ago)
Author:
zarzycki@…
Message:

<rdar://problem/5171032> Leopard9A429: Cannot ssh into my machine

Location:
trunk/launchd/src
Files:
6 modified

Legend:

Unmodified
Added
Removed
  • trunk/launchd/src/launchctl.c

    r23236 r23255  
    19301930 
    19311931int 
    1932 list_cmd(int argc, char *const argv[] __attribute__((unused))) 
     1932list_cmd(int argc, char *const argv[]) 
    19331933{ 
    19341934        launch_data_t resp, msg; 
  • trunk/launchd/src/launchd_core_logic.c

    r23254 r23255  
    245245        unsigned int hopefully_first_cnt; 
    246246        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; 
    248248        char name[0]; 
    249249}; 
     
    259259static void jobmgr_remove(jobmgr_t jm); 
    260260static void jobmgr_dispatch_all(jobmgr_t jm, bool newmounthack); 
     261static job_t jobmgr_init_session(jobmgr_t jm, const char *session_type, bool sflag); 
    261262static job_t jobmgr_find_by_pid(jobmgr_t jm, pid_t p, bool create_anon); 
    262263static job_t job_mig_intran2(jobmgr_t jm, mach_port_t mport, pid_t upid); 
     
    37533754jobmgr_new(jobmgr_t jm, mach_port_t requestorport, mach_port_t transfer_port, bool sflag, const char *name) 
    37543755{ 
    3755         const char *bootstrap_tool[] = { "/bin/launchctl", "bootstrap", "-S", name, NULL, NULL }; 
    37563756        mach_msg_size_t mxmsgsz; 
    37573757        job_t bootstrapper = NULL; 
    37583758        jobmgr_t jmr; 
    3759  
    3760         if (sflag) { 
    3761                 bootstrap_tool[4] = "-s"; 
    3762         } 
    37633759 
    37643760        launchd_assert(offsetof(struct jobmgr_s, kqjobmgr_callback) == 0); 
     
    38373833 
    38383834        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); 
    38533836        } 
    38543837 
     
    38723855        } 
    38733856        return NULL; 
     3857} 
     3858 
     3859job_t 
     3860jobmgr_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; 
    38743881} 
    38753882 
     
    48724879        } 
    48734880 
     4881        job_log(j, LOG_DEBUG, "Looking up per user launchd for UID: %u", which_user); 
     4882 
     4883        runtime_get_caller_creds(&ldc); 
     4884 
    48744885        if (getpid() != 1) { 
     4886                job_log(j, LOG_ERR, "Only PID 1 supports per user launchd lookups."); 
    48754887                return BOOTSTRAP_NOT_PRIVILEGED; 
    48764888        } 
    4877  
    4878         runtime_get_caller_creds(&ldc); 
    48794889 
    48804890        if (ldc.euid || ldc.uid) { 
    48814891                which_user = ldc.euid ? ldc.euid : ldc.uid; 
    4882         } 
    4883  
    4884         if (which_user == 0) { 
    4885                 return BOOTSTRAP_NOT_PRIVILEGED; 
    48864892        } 
    48874893 
     
    49084914                char lbuf[1024]; 
    49094915 
     4916                job_log(j, LOG_DEBUG, "Creating per user launchd job for UID: %u", which_user); 
     4917 
    49104918                sprintf(lbuf, "com.apple.launchd.peruser.%u", which_user); 
    49114919 
     
    49284936 
    49294937                ji = job_dispatch(ji, false); 
     4938        } else { 
     4939                job_log(j, LOG_DEBUG, "Per user launchd job found for UID: %u", which_user); 
    49304940        } 
    49314941 
     
    52395249        mach_port_t reqport, rcvright; 
    52405250        kern_return_t kr = 1; 
     5251        struct ldcred ldc; 
    52415252        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 
    52535269                jobmgr_log(j->mgr, LOG_DEBUG, "Renaming to: %s", session_type); 
    52545270                strcpy(j->mgr->name, session_type); 
    52555271 
    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)); 
    52595274                } 
    52605275 
    52615276                kr = 0; 
    52625277                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; 
    52685282                goto out; 
    52695283        } 
    52705284 
    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)) { 
    52725290                goto out; 
    52735291        } 
     
    53095327 
    53105328        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                } 
    53125332        } else if (jmr) { 
    53135333                jobmgr_shutdown(jmr); 
  • trunk/launchd/src/liblaunch.c

    r23235 r23255  
    12051205load_launchd_jobs_at_loginwindow_prompt(int flags __attribute__((unused)), ...) 
    12061206{ 
    1207         _vprocmgr_move_subset_to_user(geteuid() ? geteuid() : getuid(), "LoginWindow"); 
     1207        _vprocmgr_init("LoginWindow"); 
    12081208} 
    12091209 
  • trunk/launchd/src/libvproc.c

    r23249 r23255  
    3131#include <errno.h> 
    3232#include <unistd.h> 
     33#include <syslog.h> 
    3334 
    3435#include "liblaunch_public.h" 
     
    6667 
    6768vproc_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 
     78vproc_err_t 
     79_vprocmgr_move_subset_to_user(uid_t target_user, const char *session_type) 
    6980{ 
    7081        launch_data_t output_obj; 
    7182        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(); 
    7384        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; 
    77120        } 
    78121 
     
    80123                kr = 0; 
    81124        } 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) { 
    86129                task_set_bootstrap_port(mach_task_self(), puc); 
    87130                mach_port_deallocate(mach_task_self(), bootstrap_port); 
    88131                bootstrap_port = puc; 
    89         } else if (puc) { 
     132        } else { 
    90133                mach_port_deallocate(mach_task_self(), puc); 
    91134        } 
     
    309352        do { 
    310353                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                        } 
    312357                        previous_port = parent_port; 
    313358                } else { 
  • trunk/launchd/src/libvproc_internal.h

    r23208 r23255  
    4040#pragma GCC visibility push(default) 
    4141 
     42vproc_err_t _vprocmgr_init(const char *session_type); 
    4243vproc_err_t _vproc_post_fork_ping(void); 
    4344 
  • trunk/launchd/src/libvproc_private.h

    r23235 r23255  
    6464#define VPROCMGR_SESSION_SYSTEM         "System" 
    6565 
    66 vproc_err_t _vprocmgr_move_subset_to_user(uid_t target_user, char *session_type); 
     66vproc_err_t _vprocmgr_move_subset_to_user(uid_t target_user, const char *session_type); 
    6767 
    6868#pragma GCC visibility pop