]> err.no Git - linux-2.6/commitdiff
tty: Fix termios tty window resize race with pty/tty pair
authorAlan Cox <alan@lxorguk.ukuu.org.uk>
Tue, 26 Aug 2008 18:55:58 +0000 (19:55 +0100)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 27 Aug 2008 21:37:09 +0000 (14:37 -0700)
Kanru Chen posted a patch versus the old code which deals with the case
where you resize the pty side of a pty/tty pair. In that situation the
termios data is updated for both pty and tty but the locks are not held
for the right side.

This implements the fix differently against the updated tty code. Patch
by self but the hard bit (noticing and fixing the bug) is thanks to Kanru
Chen.

Signed-off-by: Alan Cox <alan@redhat.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/char/tty_io.c

index a27160ba21d7d8cb8eb9636da015075b1bc5b587..daeb8f76697123bf47015e0145e5a15ccfe86940 100644 (file)
@@ -2498,7 +2498,7 @@ static int tiocgwinsz(struct tty_struct *tty, struct winsize __user *arg)
 /**
  *     tty_do_resize           -       resize event
  *     @tty: tty being resized
- *     @real_tty: real tty (if using a pty/tty pair)
+ *     @real_tty: real tty (not the same as tty if using a pty/tty pair)
  *     @rows: rows (character)
  *     @cols: cols (character)
  *
@@ -2512,7 +2512,8 @@ int tty_do_resize(struct tty_struct *tty, struct tty_struct *real_tty,
        struct pid *pgrp, *rpgrp;
        unsigned long flags;
 
-       mutex_lock(&tty->termios_mutex);
+       /* For a PTY we need to lock the tty side */
+       mutex_lock(&real_tty->termios_mutex);
        if (!memcmp(ws, &tty->winsize, sizeof(*ws)))
                goto done;
        /* Get the PID values and reference them so we can
@@ -2533,7 +2534,7 @@ int tty_do_resize(struct tty_struct *tty, struct tty_struct *real_tty,
        tty->winsize = *ws;
        real_tty->winsize = *ws;
 done:
-       mutex_unlock(&tty->termios_mutex);
+       mutex_unlock(&real_tty->termios_mutex);
        return 0;
 }