diff --git a/src/exec_pty.c b/src/exec_pty.c index 095fdee75..945020470 100644 --- a/src/exec_pty.c +++ b/src/exec_pty.c @@ -110,7 +110,7 @@ static void del_io_events(bool nonblocking); static void sync_ttysize(struct exec_closure_pty *ec); static int safe_close(int fd); static void ev_free_by_fd(struct sudo_event_base *evbase, int fd); -static void check_foreground(struct exec_closure_pty *ec); +static pid_t check_foreground(struct exec_closure_pty *ec); static void add_io_events(struct sudo_event_base *evbase); static void schedule_signal(struct exec_closure_pty *ec, int signo); @@ -487,22 +487,25 @@ log_winchange(unsigned int rows, unsigned int cols) /* * Check whether we are running in the foregroup. - * Updates the foreground global and does lazy init of the - * the pty slave as needed. + * Updates the foreground global and updates the window size. + * Returns 0 if there is no tty, the foreground process group ID + * on success, or -1 on failure (tty revoked). */ -static void +static pid_t check_foreground(struct exec_closure_pty *ec) { + int ret = 0; debug_decl(check_foreground, SUDO_DEBUG_EXEC); if (io_fds[SFD_USERTTY] != -1) { - foreground = tcgetpgrp(io_fds[SFD_USERTTY]) == ec->ppgrp; + if ((ret = tcgetpgrp(io_fds[SFD_USERTTY])) != -1) { + foreground = ret == ec->ppgrp; - /* Also check for window size changes. */ - sync_ttysize(ec); + /* Also check for window size changes. */ + sync_ttysize(ec); + } } - - debug_return; + debug_return_int(ret); } /* @@ -568,6 +571,7 @@ suspend_sudo(struct exec_closure_pty *ec, int signo) log_suspend(SIGCONT); /* Check foreground/background status on resume. */ + /* XXX - handle missing tty */ check_foreground(ec); /* diff --git a/src/get_pty.c b/src/get_pty.c index 108980c86..75c5374d2 100644 --- a/src/get_pty.c +++ b/src/get_pty.c @@ -36,13 +36,16 @@ #include #include -#if defined(HAVE_LIBUTIL_H) -# include -#elif defined(HAVE_UTIL_H) -# include -#endif -#ifdef HAVE_PTY_H -# include +#if defined(HAVE_OPENPTY) +# if defined(HAVE_LIBUTIL_H) +# include /* *BSD */ +# elif defined(HAVE_UTIL_H) +# include /* macOS */ +# elif defined(HAVE_PTY_H) +# include /* Linux */ +# else +# include /* Solaris */ +# endif #endif #include "sudo.h"