Projects
Browse Source     Search     Timeline     Wiki

Changeset 23584

Show
Ignore:
Timestamp:
2008-04-02 10:48:25 (5 months ago)
Author:
zarzycki@…
Message:

<rdar://problem/5201578> Work around Unix (environmental variables and credentials are copied, not referenced)

Files:
1 modified

Legend:

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

    r23580 r23584  
    429429static void job_setup_fd(job_t j, int target_fd, const char *path, int flags); 
    430430static void job_postfork_become_user(job_t j); 
     431static void job_postfork_test_user(job_t j); 
    431432static void job_log_pids_with_weird_uids(job_t j); 
    432433static void job_force_sampletool(job_t j); 
     
    31103111 
    31113112void 
     3113job_postfork_test_user(job_t j) 
     3114{ 
     3115        /* This function is all about 5201578 */ 
     3116 
     3117        const char *shell_env_var = getenv("SHELL"); 
     3118        const char *home_env_var = getenv("HOME"); 
     3119        const char *user_env_var = getenv("USER"); 
     3120        const char *logname_env_var = getenv("LOGNAME"); 
     3121        uid_t tmp_uid, local_uid = getuid(); 
     3122        gid_t tmp_gid, local_gid = getgid(); 
     3123        char shellpath[PATH_MAX]; 
     3124        char homedir[PATH_MAX]; 
     3125        char loginname[2000]; 
     3126        struct passwd *pwe; 
     3127 
     3128 
     3129        if (!job_assumes(j, shell_env_var && home_env_var && user_env_var && logname_env_var 
     3130                                && strcmp(user_env_var, logname_env_var) == 0)) { 
     3131                goto out_bad; 
     3132        } 
     3133 
     3134        if ((pwe = getpwnam(user_env_var)) == NULL) { 
     3135                job_log(j, LOG_ERR, "The account \"%s\" has been deleted out from under us!", user_env_var); 
     3136                goto out_bad; 
     3137        } 
     3138 
     3139        /* 
     3140         * We must copy the results of getpw*(). 
     3141         * 
     3142         * Why? Because subsequent API calls may call getpw*() as a part of 
     3143         * their implementation. Since getpw*() returns a [now thread scoped] 
     3144         * global, we must therefore cache the results before continuing. 
     3145         */ 
     3146 
     3147        tmp_uid = pwe->pw_uid; 
     3148        tmp_gid = pwe->pw_gid; 
     3149 
     3150        strlcpy(shellpath, pwe->pw_shell, sizeof(shellpath)); 
     3151        strlcpy(loginname, pwe->pw_name, sizeof(loginname)); 
     3152        strlcpy(homedir, pwe->pw_dir, sizeof(homedir)); 
     3153 
     3154        if (strcmp(shellpath, shell_env_var) != 0) { 
     3155                job_log(j, LOG_ERR, "The %s environmental variable changed out from under us!", "SHELL"); 
     3156                goto out_bad; 
     3157        } 
     3158        if (strcmp(loginname, logname_env_var) != 0) { 
     3159                job_log(j, LOG_ERR, "The %s environmental variable changed out from under us!", "USER"); 
     3160                goto out_bad; 
     3161        } 
     3162        if (strcmp(homedir, home_env_var) != 0) { 
     3163                job_log(j, LOG_ERR, "The %s environmental variable changed out from under us!", "HOME"); 
     3164                goto out_bad; 
     3165        } 
     3166        if (local_uid != tmp_uid) { 
     3167                job_log(j, LOG_ERR, "The %cID of the account (%u) changed out from under us (%u)!", 
     3168                                'U', tmp_uid, local_uid); 
     3169                goto out_bad; 
     3170        } 
     3171        if (local_gid != tmp_gid) { 
     3172                job_log(j, LOG_ERR, "The %cID of the account (%u) changed out from under us (%u)!", 
     3173                                'G', tmp_gid, local_gid); 
     3174                goto out_bad; 
     3175        } 
     3176 
     3177        return; 
     3178out_bad: 
     3179        job_assumes(j, runtime_kill(getppid(), SIGTERM) != -1); 
     3180        _exit(EXIT_FAILURE); 
     3181} 
     3182 
     3183void 
    31123184job_postfork_become_user(job_t j) 
    31133185{ 
     
    31223194 
    31233195        if (getuid() != 0) { 
    3124                 return; 
     3196                return job_postfork_test_user(j); 
    31253197        } 
    31263198