| | 3113 | job_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; |
| | 3178 | out_bad: |
| | 3179 | job_assumes(j, runtime_kill(getppid(), SIGTERM) != -1); |
| | 3180 | _exit(EXIT_FAILURE); |
| | 3181 | } |
| | 3182 | |
| | 3183 | void |