Projects
Browse Source     Search     Timeline     Wiki

Changeset 23015

Show
Ignore:
Timestamp:
01/22/07 12:55:07 (23 months ago)
Author:
zarzycki@…
Message:

Nothing like writing code to track down bugs in other software.

Files:
1 modified

Legend:

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

    r23013 r23015  
    292292static void job_setup_fd(job_t j, int target_fd, const char *path, int flags); 
    293293static void job_postfork_become_user(job_t j); 
     294static void job_find_and_blame_pids_with_weird_uids(job_t j); 
    294295static void job_force_sampletool(job_t j); 
    295296static void job_reparent_hack(job_t j, const char *where); 
     
    19541955 
    19551956void 
     1957job_find_and_blame_pids_with_weird_uids(job_t j) 
     1958{ 
     1959        int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL }; 
     1960        size_t i, kp_cnt, len = 10*1024*1024; 
     1961        struct kinfo_proc *kp = malloc(len); 
     1962        uid_t u = j->mach_uid; 
     1963 
     1964        if (!job_assumes(j, sysctl(mib, 3, kp, &len, NULL, 0) != -1)) { 
     1965                return; 
     1966        } 
     1967 
     1968        kp_cnt = len / sizeof(struct kinfo_proc); 
     1969 
     1970        for (i = 0; i <= kp_cnt; i++) { 
     1971                uid_t i_euid = kp[i].kp_eproc.e_ucred.cr_uid; 
     1972                uid_t i_uid = kp[i].kp_eproc.e_pcred.p_ruid; 
     1973                uid_t i_svuid = kp[i].kp_eproc.e_pcred.p_svuid; 
     1974 
     1975                if (i_euid != u && i_uid != u && i_svuid != u) { 
     1976                        continue; 
     1977                } 
     1978 
     1979                job_log(j, LOG_ERR, "PID %u (\"%s\") has no account to back it! (real/effective/saved UIDs: %u/%u/%u)", 
     1980                                kp[i].kp_proc.p_pid, kp[i].kp_proc.p_comm, i_uid, i_euid, i_svuid); 
     1981        } 
     1982 
     1983        free(kp); 
     1984} 
     1985 
     1986void 
    19561987job_postfork_become_user(job_t j) 
    19571988{ 
     
    19752006                if ((pwe = getpwuid(j->mach_uid)) == NULL) { 
    19762007                        job_log(j, LOG_ERR, "getpwuid(\"%u\") failed", j->mach_uid); 
     2008                        job_find_and_blame_pids_with_weird_uids(j); 
    19772009                        _exit(EXIT_FAILURE); 
    19782010                }