]> err.no Git - linux-2.6/commitdiff
[PATCH] tty: lock ticogwinsz
authorAlan Cox <alan@lxorguk.ukuu.org.uk>
Fri, 29 Sep 2006 09:00:40 +0000 (02:00 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Fri, 29 Sep 2006 16:18:16 +0000 (09:18 -0700)
Now we lock the set ioctl its trivial to lock the get one so the data
copied is consistent.  At the moment we have the BKL here but this removes
the need for it and is a step in the right direction

Signed-off-by: Alan Cox <alan@redhat.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/char/tty_io.c

index 18085a20df23942b05e7684d0639aa9261f31d79..b4f37c65b95c12d6314a50d90da759f72646caa2 100644 (file)
@@ -2740,18 +2740,21 @@ static int tiocsti(struct tty_struct *tty, char __user *p)
  *     @tty; tty
  *     @arg: user buffer for result
  *
- *     Copies the kernel idea of the window size into the user buffer. No
- *     locking is done.
+ *     Copies the kernel idea of the window size into the user buffer.
  *
- *     FIXME: Returning random values racing a window size set is wrong
- *     should lock here against that
+ *     Locking: tty->termios_sem is taken to ensure the winsize data
+ *             is consistent.
  */
 
 static int tiocgwinsz(struct tty_struct *tty, struct winsize __user * arg)
 {
-       if (copy_to_user(arg, &tty->winsize, sizeof(*arg)))
-               return -EFAULT;
-       return 0;
+       int err;
+
+       down(&tty->termios_sem);
+       err = copy_to_user(arg, &tty->winsize, sizeof(*arg));
+       up(&tty->termios_sem);
+
+       return err ? -EFAULT: 0;
 }
 
 /**