Files
linux/drivers/char
Alan Cox 8077088449 n_tty: Fix echo race
If a tty in N_TTY mode with echo enabled manages to get itself into a state
where
	- echo characters are pending
	- FASYNC is enabled
	- tty_write_wakeup is called from either
		- a device write path (pty)
		- an IRQ (serial)

then it either deadlocks or explodes taking a mutex in the IRQ path.

On the serial side it is almost impossible to reproduce because you have to
go from a full serial port to a near empty one with echo characters
pending. The pty case happens to have become possible to trigger using
emacs and ptys, the pty changes having created a scenario which shows up
this bug.

The code path is

	n_tty:process_echoes() (takes mutex)
	tty_io:tty_put_char()
	pty:pty_write  (or serial paths)
	tty_wakeup     (from pty_write or serial IRQ)
	n_tty_write_wakeup()
	process_echoes()
	*KABOOM*

Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2009-07-16 09:19:16 -07:00
..
2009-06-11 08:51:01 -07:00
2009-06-22 11:32:24 -07:00
2009-07-12 12:22:34 -07:00
2009-07-12 12:22:34 -07:00
2009-07-12 12:22:34 -07:00
2008-06-20 14:05:55 -06:00
2008-12-13 11:25:49 -08:00
2009-07-12 12:22:34 -07:00
2008-10-20 08:52:41 -07:00
2008-12-13 09:12:07 +00:00
2009-06-19 16:46:06 -07:00
2009-07-12 12:22:34 -07:00
2008-07-20 17:12:36 -07:00
2009-04-07 08:31:03 -07:00
2008-06-20 14:05:57 -06:00
2009-06-18 11:16:55 +10:00
2009-01-02 10:28:32 -08:00
2009-07-12 12:22:34 -07:00
2009-07-12 12:22:34 -07:00
2008-06-20 14:05:48 -06:00
2009-07-12 12:22:34 -07:00
2008-07-24 10:47:14 -07:00
2009-07-12 12:22:34 -07:00
2009-07-12 12:22:34 -07:00
2009-07-12 12:22:34 -07:00
2009-07-16 09:19:16 -07:00
2009-07-16 09:19:16 -07:00
2009-06-18 13:03:54 -07:00
2009-07-12 12:22:34 -07:00
2009-07-12 12:22:34 -07:00
2008-07-20 17:12:38 -07:00
2009-07-12 12:22:34 -07:00
2009-01-08 16:44:03 -07:00
2009-02-22 09:23:02 -08:00
2009-06-11 08:51:01 -07:00
2009-07-12 12:22:34 -07:00
2009-03-16 08:34:35 -06:00
2008-07-20 17:12:38 -07:00
2009-07-12 12:22:34 -07:00
2009-07-12 12:22:34 -07:00
2009-07-12 12:22:34 -07:00
2009-07-12 12:22:34 -07:00
2009-07-12 12:22:34 -07:00
2009-06-18 13:03:59 -07:00
2009-07-03 15:45:29 +01:00
2008-06-20 14:05:51 -06:00
2009-06-11 08:51:02 -07:00
2009-06-16 12:01:16 -07:00
2009-07-12 12:22:34 -07:00
2009-07-16 09:19:16 -07:00
2009-07-12 12:22:34 -07:00
2009-07-16 09:19:16 -07:00