tty: Fix the ldisc hangup race
authorAlan Cox <alan@linux.intel.com>
Mon, 8 Feb 2010 10:09:26 +0000 (10:09 +0000)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 2 Mar 2010 22:43:22 +0000 (14:43 -0800)
commit638b9648ab51c9c549ff5735d3de519ef6199df3
tree08b617792ac4a06339d4264706af44a49c8dd555
parent97c22394bb5dc89683ac150f1003d47e6e9418d9
tty: Fix the ldisc hangup race

This was noticed by Matthias Urlichs and he proposed a fix. This patch
does the fixing a different way to avoid introducing several new race
conditions into the code.

The problem case is TTY_DRIVER_RESET_TERMIOS = 0. In that case while we
abort the ldisc change, the hangup processing has not cleaned up and restarted
the ldisc either.

We can't restart the ldisc stuff in the set_ldisc as we don't know what
the hangup did and may touch stuff we shouldn't as we are no longer
supposed to influence the tty at that point in case it has been re-opened
before we get rescheduled.

Instead do it the simple way. Always re-init the ldisc on the hangup, but
use TTY_DRIVER_RESET_TERMIOS to indicate that we should force N_TTY.

Signed-off-by: Alan Cox <alan@linux.intel.com>
Cc: stable <stable@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/char/tty_ldisc.c