tty: WARN for attempted set_termios() of pty master
authorPeter Hurley <peter@hurleysoftware.com>
Thu, 16 Oct 2014 19:33:22 +0000 (15:33 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 6 Nov 2014 00:34:36 +0000 (16:34 -0800)
The pty master's termios should never be set; currently, all code
paths which call the driver's set_termios() method ensure that the
pty slave's termios is being set.

Signed-off-by: Peter Hurley <peter@hurleysoftware.com>
Reviewed-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/pty.c
drivers/tty/tty_ioctl.c

index 4c0218db85ad6eec2dd484aa2c3dd9330b45a9ea..6c7602592fe0aa0d2f13c069535ceaf074afdd88 100644 (file)
@@ -477,7 +477,6 @@ static const struct tty_operations master_pty_ops_bsd = {
        .flush_buffer = pty_flush_buffer,
        .chars_in_buffer = pty_chars_in_buffer,
        .unthrottle = pty_unthrottle,
-       .set_termios = pty_set_termios,
        .ioctl = pty_bsd_ioctl,
        .cleanup = pty_cleanup,
        .resize = pty_resize,
@@ -654,7 +653,6 @@ static const struct tty_operations ptm_unix98_ops = {
        .flush_buffer = pty_flush_buffer,
        .chars_in_buffer = pty_chars_in_buffer,
        .unthrottle = pty_unthrottle,
-       .set_termios = pty_set_termios,
        .ioctl = pty_unix98_ioctl,
        .resize = pty_resize,
        .shutdown = pty_unix98_shutdown,
index 62380ccf70fb469f3e3c676452819ecfdf6ff4b5..ab4562c06af413a1dc26d85ad26542b0267b6a85 100644 (file)
@@ -528,6 +528,8 @@ EXPORT_SYMBOL(tty_termios_hw_change);
  *     is a bit of layering violation here with n_tty in terms of the
  *     internal knowledge of this function.
  *
+ *     A master pty's termios should never be set.
+ *
  *     Locking: termios_rwsem
  */
 
@@ -537,6 +539,8 @@ int tty_set_termios(struct tty_struct *tty, struct ktermios *new_termios)
        struct tty_ldisc *ld;
        unsigned long flags;
 
+       WARN_ON(tty->driver->type == TTY_DRIVER_TYPE_PTY &&
+               tty->driver->subtype == PTY_TYPE_MASTER);
        /*
         *      Perform the actual termios internal changes under lock.
         */