]> granicus.if.org Git - sudo/commitdiff
If we get a signal other than SIGCHLD in the monitor, pass it directly
authorTodd C. Miller <Todd.Miller@courtesan.com>
Wed, 2 Feb 2011 18:27:24 +0000 (13:27 -0500)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Wed, 2 Feb 2011 18:27:24 +0000 (13:27 -0500)
to the child.

src/exec_pty.c

index 6a21f9e18162d09eaa0a4ced2e9537113d5968c2..fabaa54a6e686bd76a7194f0366586e7254b5264 100644 (file)
@@ -943,7 +943,6 @@ exec_monitor(struct command_details *details, char *argv[], char *envp[],
        }
 
        if (FD_ISSET(signal_pipe[0], fdsr)) {
-           /* Read child status. */
            n = read(signal_pipe[0], &signo, sizeof(signo));
            if (n == -1) {
                if (errno == EINTR || errno == EAGAIN)
@@ -951,11 +950,15 @@ exec_monitor(struct command_details *details, char *argv[], char *envp[],
                warning("error reading from signal pipe");
                goto done;
            }
-           /* We should only ever get SIGCHLD. */
-           if (signo == SIGCHLD) {
+           /*
+            * Handle SIGCHLD specially and deliver other signals
+            * directly to the child.
+            */
+           if (signo == SIGCHLD)
                alive = handle_sigchld(backchannel, &cstat);
-               continue;
-           }
+           else
+               deliver_signal(child, signo);
+           continue;
        }
        if (errpipe[0] != -1 && FD_ISSET(errpipe[0], fdsr)) {
            /* read errno or EOF from command pipe */