From: Todd C. Miller Date: Sat, 10 Apr 2010 14:31:47 +0000 (-0400) Subject: Only need to take action on SIGCHLD in parent if no I/O logger. X-Git-Tag: SUDO_1_8_0~735 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=711b8d1c04efbfbb44db0e4fb7d1f272d570503f;p=sudo Only need to take action on SIGCHLD in parent if no I/O logger. If there is an I/O logger we will receive ECONNRESET or EPIPE when we try to read from the socketpair. --- diff --git a/src/script.c b/src/script.c index 67ad92a59..5cc4ddd46 100644 --- a/src/script.c +++ b/src/script.c @@ -509,36 +509,27 @@ script_execve(struct command_details *details, char *argv[], char *envp[], zero_bytes(&input, sizeof(input)); zero_bytes(&output, sizeof(output)); for (;;) { - /* Wait for children as needed. */ if (recvsig[SIGCHLD]) { pid_t pid; - int flags = WNOHANG; + /* + * If logging I/O, child is the intermediate process, + * otherwise it is the command itself. + */ recvsig[SIGCHLD] = FALSE; - if (log_io) - flags |= WUNTRACED; do { - pid = waitpid(child, &child_status, flags); + pid = waitpid(child, &child_status, WNOHANG); } while (pid == -1 && errno == EINTR); if (pid == child) { - /* - * If there is no I/O logger we are done. Otherwise, - * we wait for ECONNRESET or EPIPE from the socketpair. - */ - if (!log_io) - recvsig[SIGCHLD] = TRUE; /* XXX - hacky, see below */ - else if (WIFSTOPPED(child_status)) - recvsig[WSTOPSIG(child_status)] = TRUE; + /* If not logging I/O and child has exited we are done. */ + if (!log_io) { + cstat->type = CMD_WSTATUS; + cstat->val = child_status; + return 0; + } } } - /* If not logging I/O and child has exited we are done. */ - if (!log_io && recvsig[SIGCHLD]) { - cstat->type = CMD_WSTATUS; - cstat->val = child_status; - break; - } - zero_bytes(fdsw, howmany(maxfd + 1, NFDBITS) * sizeof(fd_mask)); zero_bytes(fdsr, howmany(maxfd + 1, NFDBITS) * sizeof(fd_mask));