Changeset 23015
- Timestamp:
- 01/22/07 12:55:07 (23 months ago)
- Files:
-
- 1 modified
-
trunk/launchd/src/launchd_core_logic.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/launchd/src/launchd_core_logic.c
r23013 r23015 292 292 static void job_setup_fd(job_t j, int target_fd, const char *path, int flags); 293 293 static void job_postfork_become_user(job_t j); 294 static void job_find_and_blame_pids_with_weird_uids(job_t j); 294 295 static void job_force_sampletool(job_t j); 295 296 static void job_reparent_hack(job_t j, const char *where); … … 1954 1955 1955 1956 void 1957 job_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 1986 void 1956 1987 job_postfork_become_user(job_t j) 1957 1988 { … … 1975 2006 if ((pwe = getpwuid(j->mach_uid)) == NULL) { 1976 2007 job_log(j, LOG_ERR, "getpwuid(\"%u\") failed", j->mach_uid); 2008 job_find_and_blame_pids_with_weird_uids(j); 1977 2009 _exit(EXIT_FAILURE); 1978 2010 }

