]> granicus.if.org Git - sudo/commitdiff
Only need to take action on SIGCHLD in parent if no I/O logger.
authorTodd C. Miller <Todd.Miller@courtesan.com>
Sat, 10 Apr 2010 14:31:47 +0000 (10:31 -0400)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Sat, 10 Apr 2010 14:31:47 +0000 (10:31 -0400)
If there is an I/O logger we will receive ECONNRESET or EPIPE when
we try to read from the socketpair.

src/script.c

index 67ad92a59cbb06cea79e1de08fe36305d297b75d..5cc4ddd465e5b046eac67e1637adbc879d9aba19 100644 (file)
@@ -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));