Hi Filipe, On 06/03/2015 10:10 PM, Filipe Brandenburger wrote: > Hi Peter, > > I updated the Bugzilla with additional information, including a strace > log of both bash and sshd while reproducing the problem. > > strace of bash is here: > https://bugzilla.kernel.org/attachment.cgi?id=178851 > > strace of sshd is here: > https://bugzilla.kernel.org/attachment.cgi?id=178861 > > Looks to me like "echo" is enabled when the newline and prompt are > printed, but I might have glanced something and it might not be... > Please take a look. > > Let me know if you'd like me to instrument the kernel to gather more > information about this issue. Well, I still couldn't repro this bug but I have a hypothesis that the bash sig handler is executing before the flush occurs, perhaps because the flush is stalled waiting for the write lock. Would you please try the patch below? PS - while trying to reproduce this with gnu expect, I discovered that bash does not always reprint the prompt. The prompt is only reprinted if read() was interrupted, not if write() completed. However, this is different than your problem because the bash sig handler always writes "^C". PPS - FWIW, the line kill key binding is usually ^U. You can check what the terminal key bindings are with "stty -a" --- >% --- Subject: [PATCH] n_tty: signal and flush atomically When handling signalling char, claim the termios write lock before signalling waiting readers and writers to prevent further i/o before flushing the echo and output buffers. This prevents a userspace signal handler which may output from racing the terminal flush. Reference: Bugzilla #99351 ("Output truncated in ssh session after...") Fixes: commit d2b6f44779d3 ("n_tty: Fix signal handling flushes") Reported-by: Filipe Brandenburger <filbranden@xxxxxxxxxx> Signed-off-by: Peter Hurley <peter@xxxxxxxxxxxxxxxxxx> --- drivers/tty/n_tty.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c index c9c27f6..ee8bfac 100644 --- a/drivers/tty/n_tty.c +++ b/drivers/tty/n_tty.c @@ -1108,19 +1108,29 @@ static void eraser(unsigned char c, struct tty_struct *tty) * Locking: ctrl_lock */ -static void isig(int sig, struct tty_struct *tty) +static void __isig(int sig, struct tty_struct *tty) { - struct n_tty_data *ldata = tty->disc_data; struct pid *tty_pgrp = tty_get_pgrp(tty); if (tty_pgrp) { kill_pgrp(tty_pgrp, sig, 1); put_pid(tty_pgrp); } +} - if (!L_NOFLSH(tty)) { +static void isig(int sig, struct tty_struct *tty) +{ + struct n_tty_data *ldata = tty->disc_data; + + if (L_NOFLSH(tty)) { + /* signal only */ + __isig(sig, tty); + + } else { /* signal and flush */ up_read(&tty->termios_rwsem); down_write(&tty->termios_rwsem); + __isig(sig, tty); + /* clear echo buffer */ mutex_lock(&ldata->output_lock); ldata->echo_head = ldata->echo_tail = 0; -- 2.4.3 -- To unsubscribe from this list: send the line "unsubscribe linux-serial" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html