lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20091015160501.36a31973@lxorguk.ukuu.org.uk>
Date:	Thu, 15 Oct 2009 16:05:01 +0100
From:	Alan Cox <alan@...rguk.ukuu.org.uk>
To:	Tomasz Chmielewski <mangoo@...g.org>
Cc:	linux-kernel@...r.kernel.org, linux-usb@...r.kernel.org
Subject: Re: 2.6.31.4: WARNING: at drivers/usb/serial/usb-serial.c:446
 serial_unthrottle

On Thu, 15 Oct 2009 15:12:03 +0200
Tomasz Chmielewski <mangoo@...g.org> wrote:

> I see my minicom segfaulted for some reason (probably as I closed konsole window without exiting minicom first).
> 
> And I see this warning in dmesg - anything useful?

Looks like a very very old bug in the tty code. I have a patch for this I'm
testing for a while and will sort out properly after the kernel summit. In
the mean time have a play with the patch below which ought to do the trick.

n_tty: fix throttling

From: Alan Cox <alan@...ux.intel.com>

n_tty inadevertently calls throttle and unthrottle methods during its init.
This happens before the tty device is open and causes problems for the
drivers, in particular they may not have their state and locks even
initialised at this point.

Signed-off-by: Alan Cox <alan@...ux.intel.com>
---

 drivers/char/n_tty.c |   35 ++++++++++++++++++++++++++---------
 1 files changed, 26 insertions(+), 9 deletions(-)


diff --git a/drivers/char/n_tty.c b/drivers/char/n_tty.c
index 2e50f4d..b45170c 100644
--- a/drivers/char/n_tty.c
+++ b/drivers/char/n_tty.c
@@ -178,26 +178,23 @@ static void reset_buffer_flags(struct tty_struct *tty)
 	tty->canon_head = tty->canon_data = tty->erasing = 0;
 	memset(&tty->read_flags, 0, sizeof tty->read_flags);
 	n_tty_set_room(tty);
-	check_unthrottle(tty);
 }
 
 /**
- *	n_tty_flush_buffer	-	clean input queue
+ *	n_tty_do_flush		-	clean input queue
  *	@tty:	terminal device
  *
  *	Flush the input buffer. Called when the line discipline is
- *	being closed, when the tty layer wants the buffer flushed (eg
- *	at hangup) or when the N_TTY line discipline internally has to
- *	clean the pending queue (for example some signals).
+ *	being closed, or indirectly when the tty layer wants the buffer
+ *	flushed (eg at hangup) or when the N_TTY line discipline internally
+ *	has to clean the pending queue (for example some signals).
  *
  *	Locking: ctrl_lock, read_lock.
  */
 
-static void n_tty_flush_buffer(struct tty_struct *tty)
+static void n_tty_do_flush(struct tty_struct *tty)
 {
 	unsigned long flags;
-	/* clear everything and unthrottle the driver */
-	reset_buffer_flags(tty);
 
 	if (!tty->link)
 		return;
@@ -211,6 +208,25 @@ static void n_tty_flush_buffer(struct tty_struct *tty)
 }
 
 /**
+ *	n_tty_flush_buffer	-	clean input queue
+ *	@tty:	terminal device
+ *
+ *	Flush the input buffer. Called when the tty layer wants the buffer
+ *	flushed (eg at hangup) or when the N_TTY line discipline internally
+ *	has to clean the pending queue (for example some signals).
+ *
+ *	Locking: ctrl_lock, read_lock.
+ */
+
+static void n_tty_flush_buffer(struct tty_struct *tty)
+{
+	/* clear everything and unthrottle the driver */
+	reset_buffer_flags(tty);
+	check_unthrottle(tty);
+	n_tty_do_flush(tty);
+}
+
+/**
  *	n_tty_chars_in_buffer	-	report available bytes
  *	@tty: tty device
  *
@@ -1535,7 +1551,8 @@ static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
 
 static void n_tty_close(struct tty_struct *tty)
 {
-	n_tty_flush_buffer(tty);
+	reset_buffer_flags(tty);
+	n_tty_do_flush(tty);
 	if (tty->read_buf) {
 		kfree(tty->read_buf);
 		tty->read_buf = NULL;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ