From: Todd C. Miller Date: Sun, 7 Mar 2010 12:45:17 +0000 (-0500) Subject: Use parent process group id instead of parent process id when checking X-Git-Tag: SUDO_1_8_0~836 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c8c4d6a13be8c14b63ad8911c268c3459fc359f5;p=sudo Use parent process group id instead of parent process id when checking foreground status and suspending parent. Fixes an issue when running commands under /usr/bin/time and others. --- diff --git a/src/script.c b/src/script.c index 747c7f864..8d8858054 100644 --- a/src/script.c +++ b/src/script.c @@ -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);