Re: Output truncated in ssh session after d2b6f44779d3 ("n_tty: Fix signal handling flushes")

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux PPP]     [Linux FS]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Linmodem]     [Device Mapper]     [Linux Kernel for ARM]

  Powered by Linux