|
|
|
@ -1119,7 +1119,7 @@ privsep_client_update_atime(int clisock, const userdbkeys_t *keys)
|
|
|
|
|
* will not be touched.
|
|
|
|
|
*/
|
|
|
|
|
int
|
|
|
|
|
privsep_fork(global_t *global, int clisock[], size_t nclisock)
|
|
|
|
|
privsep_fork(global_t *global, int clisock[], size_t nclisock, int *parent_rv)
|
|
|
|
|
{
|
|
|
|
|
int selfpipev[2]; /* self-pipe trick: signal handler -> select */
|
|
|
|
|
int chldpipev[2]; /* el cheapo interprocess sync early after fork */
|
|
|
|
@ -1269,21 +1269,30 @@ privsep_fork(global_t *global, int clisock[], size_t nclisock)
|
|
|
|
|
close(selfpipev[1]);
|
|
|
|
|
|
|
|
|
|
int status;
|
|
|
|
|
wait(&status);
|
|
|
|
|
pid_t wpid;
|
|
|
|
|
wpid = wait(&status);
|
|
|
|
|
if (wpid != pid) {
|
|
|
|
|
/* should never happen, warn if it does anyway */
|
|
|
|
|
log_err_printf("Child pid %lld != expected %lld from wait(2)\n",
|
|
|
|
|
(long long)wpid, (long long)pid);
|
|
|
|
|
}
|
|
|
|
|
if (WIFEXITED(status)) {
|
|
|
|
|
if (WEXITSTATUS(status) != 0) {
|
|
|
|
|
log_err_level_printf(LOG_CRIT, "Child proc %lld exited with status %d\n",
|
|
|
|
|
(long long)pid, WEXITSTATUS(status));
|
|
|
|
|
log_err_level_printf(LOG_CRIT, "Child pid %lld exited with status %d\n",
|
|
|
|
|
(long long)wpid, WEXITSTATUS(status));
|
|
|
|
|
} else {
|
|
|
|
|
log_dbg_printf("Child proc %lld exited with status %d\n",
|
|
|
|
|
(long long)pid, WEXITSTATUS(status));
|
|
|
|
|
log_dbg_printf("Child pid %lld exited with status %d\n",
|
|
|
|
|
(long long)wpid, WEXITSTATUS(status));
|
|
|
|
|
}
|
|
|
|
|
*parent_rv = WEXITSTATUS(status);
|
|
|
|
|
} else if (WIFSIGNALED(status)) {
|
|
|
|
|
log_err_level_printf(LOG_CRIT, "Child proc %lld killed by signal %d\n",
|
|
|
|
|
(long long)pid, WTERMSIG(status));
|
|
|
|
|
log_err_level_printf(LOG_CRIT, "Child pid %lld killed by signal %d\n",
|
|
|
|
|
(long long)wpid, WTERMSIG(status));
|
|
|
|
|
*parent_rv = 128 + WTERMSIG(status);
|
|
|
|
|
} else {
|
|
|
|
|
log_err_level_printf(LOG_CRIT, "Child proc %lld neither exited nor killed\n",
|
|
|
|
|
(long long)pid);
|
|
|
|
|
/* can only happen with WUNTRACED option or active tracing */
|
|
|
|
|
log_err_level_printf(LOG_CRIT, "Child pid %lld neither exited nor killed\n",
|
|
|
|
|
(long long)wpid);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|