Skip to content

Commit

Permalink
n_tty: Fix stale echo output
Browse files Browse the repository at this point in the history
When echoes cannot be flushed to output (usually because the tty
has no more write room) and L_ECHO is subsequently turned off, then
when L_ECHO is turned back on, stale echoes are output.

Output completed echoes regardless of the L_ECHO setting:
  1. before normal writes to that tty
  2. if the tty was stopped by soft flow control and is being
     restarted

Reported-by: Mikulas Patocka <mpatocka@redhat.com>
Cc: <stable@vger.kernel.org> # 3.13.x
Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Peter Hurley authored and Greg Kroah-Hartman committed Feb 13, 2014
1 parent fb78b81 commit e2613be
Showing 1 changed file with 7 additions and 5 deletions.
12 changes: 7 additions & 5 deletions drivers/tty/n_tty.c
Original file line number Diff line number Diff line change
Expand Up @@ -817,8 +817,7 @@ static void process_echoes(struct tty_struct *tty)
struct n_tty_data *ldata = tty->disc_data;
size_t echoed;

if ((!L_ECHO(tty) && !L_ECHONL(tty)) ||
ldata->echo_mark == ldata->echo_tail)
if (ldata->echo_mark == ldata->echo_tail)
return;

mutex_lock(&ldata->output_lock);
Expand Down Expand Up @@ -1244,7 +1243,8 @@ n_tty_receive_signal_char(struct tty_struct *tty, int signal, unsigned char c)
if (L_ECHO(tty)) {
echo_char(c, tty);
commit_echoes(tty);
}
} else
process_echoes(tty);
isig(signal, tty);
return;
}
Expand Down Expand Up @@ -1274,7 +1274,7 @@ n_tty_receive_char_special(struct tty_struct *tty, unsigned char c)
if (I_IXON(tty)) {
if (c == START_CHAR(tty)) {
start_tty(tty);
commit_echoes(tty);
process_echoes(tty);
return 0;
}
if (c == STOP_CHAR(tty)) {
Expand Down Expand Up @@ -1820,8 +1820,10 @@ static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
* Fix tty hang when I_IXON(tty) is cleared, but the tty
* been stopped by STOP_CHAR(tty) before it.
*/
if (!I_IXON(tty) && old && (old->c_iflag & IXON) && !tty->flow_stopped)
if (!I_IXON(tty) && old && (old->c_iflag & IXON) && !tty->flow_stopped) {
start_tty(tty);
process_echoes(tty);
}

/* The termios change make the tty ready for I/O */
if (waitqueue_active(&tty->write_wait))
Expand Down

0 comments on commit e2613be

Please sign in to comment.