When running the command in a pty, defer the call to exec_setup()
until just before we exec the command. This is consistent with the non-pty path. As a side effect, the monitor process runs as root and not the runas user.
This commit is contained in:
@@ -707,16 +707,14 @@ fork_pty(struct command_details *details, int sv[], int *maxfd, sigset_t *omask)
|
|||||||
close(signal_pipe[1]);
|
close(signal_pipe[1]);
|
||||||
fcntl(sv[1], F_SETFD, FD_CLOEXEC);
|
fcntl(sv[1], F_SETFD, FD_CLOEXEC);
|
||||||
sigprocmask(SIG_SETMASK, omask, NULL);
|
sigprocmask(SIG_SETMASK, omask, NULL);
|
||||||
if (exec_setup(details, slavename, io_fds[SFD_SLAVE]) == true) {
|
/* Close the other end of the stdin/stdout/stderr pipes and exec. */
|
||||||
/* Close the other end of the stdin/stdout/stderr pipes and exec. */
|
if (io_pipe[STDIN_FILENO][1])
|
||||||
if (io_pipe[STDIN_FILENO][1])
|
close(io_pipe[STDIN_FILENO][1]);
|
||||||
close(io_pipe[STDIN_FILENO][1]);
|
if (io_pipe[STDOUT_FILENO][0])
|
||||||
if (io_pipe[STDOUT_FILENO][0])
|
close(io_pipe[STDOUT_FILENO][0]);
|
||||||
close(io_pipe[STDOUT_FILENO][0]);
|
if (io_pipe[STDERR_FILENO][0])
|
||||||
if (io_pipe[STDERR_FILENO][0])
|
close(io_pipe[STDERR_FILENO][0]);
|
||||||
close(io_pipe[STDERR_FILENO][0]);
|
exec_monitor(details, sv[1]);
|
||||||
exec_monitor(details, sv[1]);
|
|
||||||
}
|
|
||||||
cstat.type = CMD_ERRNO;
|
cstat.type = CMD_ERRNO;
|
||||||
cstat.val = errno;
|
cstat.val = errno;
|
||||||
ignore_result(send(sv[1], &cstat, sizeof(cstat), 0));
|
ignore_result(send(sv[1], &cstat, sizeof(cstat), 0));
|
||||||
|
Reference in New Issue
Block a user