]> granicus.if.org Git - sudo/commitdiff
Use parent process group id instead of parent process id when checking
authorTodd C. Miller <Todd.Miller@courtesan.com>
Sun, 7 Mar 2010 12:45:17 +0000 (07:45 -0500)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Sun, 7 Mar 2010 12:45:17 +0000 (07:45 -0500)
foreground status and suspending parent.  Fixes an issue when running
commands under /usr/bin/time and others.

src/script.c

index 747c7f864bc0d155ca81f354cd136d2e98df8f22..8d8858054e2fc9e14b57f1e36fa46d29dedb6769 100644 (file)
@@ -97,7 +97,7 @@ static sig_atomic_t tty_initialized = 0;
 
 static sigset_t ttyblock;
 
-static pid_t parent, child;
+static pid_t ppgrp, child;
 static int child_status;
 static int foreground;
 
@@ -167,7 +167,7 @@ log_output(char *buf, unsigned int n)
 static void
 check_foreground(void)
 {
-    foreground = tcgetpgrp(script_fds[SFD_USERTTY]) == parent;
+    foreground = tcgetpgrp(script_fds[SFD_USERTTY]) == ppgrp;
     if (foreground && !tty_initialized) {
        if (term_copy(script_fds[SFD_USERTTY], script_fds[SFD_SLAVE], ttyout)) {
            tty_initialized = 1;
@@ -223,7 +223,7 @@ suspend_parent(int signo, struct script_buf *output)
        sa.sa_handler = SIG_DFL;
        sigaction(signo, &sa, &osa);
        sudo_debug(8, "kill parent %d", signo);
-       kill(parent, signo);
+       killpg(ppgrp, signo);
 
        /* Check foreground/background status on resume. */
        check_foreground();
@@ -323,7 +323,7 @@ script_execve(struct command_details *details, char *argv[], char *envp[],
     }
 #endif
 
-    parent = getpid(); /* so child can pass signals back to us */
+    ppgrp = getpgrp(); /* parent's pgrp, so child can signal us */
 
     /*
      * We communicate with the child over a bi-directional pipe.
@@ -361,7 +361,7 @@ script_execve(struct command_details *details, char *argv[], char *envp[],
        sigaddset(&ttyblock, SIGTTOU);
 
        /* Are we the foreground process? */
-       foreground = tcgetpgrp(script_fds[SFD_USERTTY]) == parent;
+       foreground = tcgetpgrp(script_fds[SFD_USERTTY]) == ppgrp;
 
        /* If stdout is not a tty we handle post-processing differently. */
        ttyout = isatty(STDOUT_FILENO);