]> granicus.if.org Git - sudo/commitdiff
When the command completes, make the monitor the foreground process
authorTodd C. Miller <Todd.Miller@sudo.ws>
Fri, 1 Dec 2017 20:43:06 +0000 (13:43 -0700)
committerTodd C. Miller <Todd.Miller@sudo.ws>
Fri, 1 Dec 2017 20:43:06 +0000 (13:43 -0700)
group before informing the main sudo process of the command's exit
status.  This will prevent processes started by the command (which
runs in a different process group) from receiving SIGHUP since the
kernel sends SIGHUP to the foreground process group associated with
the terminal session.  The monitor has a SIGHUP handler installed
so the signal is effectively ignored.

src/exec_monitor.c

index 470f7a069a2ac86d1b6b740747310f1bdcd41382..d497f620cec4ca038c9675b5c446d28e336ea30b 100644 (file)
@@ -630,6 +630,17 @@ exec_monitor(struct command_details *details, sigset_t *oset,
        } while (pid == -1 && errno == EINTR);
        /* XXX - update cstat with wait status? */
     }
+
+    /*
+     * Take the controlling tty.  This prevents processes spawned by the
+     * command from receiving SIGHUP when the session leader (us) exits.
+     */
+    if (tcsetpgrp(io_fds[SFD_SLAVE], mc.mon_pgrp) == -1) {
+       sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO,
+           "%s: unable to set foreground pgrp to %d (monitor)",
+           __func__, (int)mc.mon_pgrp);
+    }
+
     /* Send parent status. */
     send_status(backchannel, &cstat);