diff --git a/src/exec_nopty.c b/src/exec_nopty.c index b4b01871a..60794f7b6 100644 --- a/src/exec_nopty.c +++ b/src/exec_nopty.c @@ -447,10 +447,15 @@ write_callback(int fd, int what, void *v) ev_free_by_fd(evbase, fd); } } - /* Enable reader if buffer is not full. */ + /* + * Enable reader if buffer is not full but avoid reading + * /dev/tty if the command is no longer running. + */ if (iob->revent != NULL && iob->len != sizeof(iob->buf)) { - if (sudo_ev_add(evbase, iob->revent, NULL, false) == -1) - sudo_fatal("%s", U_("unable to add event to queue")); + if (!USERTTY_EVENT(iob->revent) || iob->ec->cmnd_pid != -1) { + if (sudo_ev_add(evbase, iob->revent, NULL, false) == -1) + sudo_fatal("%s", U_("unable to add event to queue")); + } } } diff --git a/src/exec_pty.c b/src/exec_pty.c index ed8fa0f3d..9a8ddfab1 100644 --- a/src/exec_pty.c +++ b/src/exec_pty.c @@ -469,10 +469,13 @@ write_callback(int fd, int what, void *v) ev_free_by_fd(evbase, fd); } } - /* Enable reader if buffer is not full. */ - if (iob->revent != NULL && - (ttymode == TERM_RAW || !USERTTY_EVENT(iob->revent))) { - if (iob->len != sizeof(iob->buf)) { + /* + * Enable reader if buffer is not full but avoid reading /dev/tty + * if not in raw mode or the command is no longer running. + */ + if (iob->revent != NULL && iob->len != sizeof(iob->buf)) { + if (!USERTTY_EVENT(iob->revent) || + (ttymode == TERM_RAW && iob->ec->cmnd_pid != -1)) { if (sudo_ev_add(evbase, iob->revent, NULL, false) == -1) sudo_fatal("%s", U_("unable to add event to queue")); }