vt: vt_ioctl: remove unnecessary console allocation checks
authorEric Biggers <ebiggers@google.com>
Mon, 24 Feb 2020 08:03:26 +0000 (00:03 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 2 Apr 2020 14:34:36 +0000 (16:34 +0200)
commit 1aa6e058dd6cd04471b1f21298270014daf48ac9 upstream.

The vc_cons_allocated() checks in vt_ioctl() and vt_compat_ioctl() are
unnecessary because they can only be reached by calling ioctl() on an
open tty, which implies the corresponding virtual console is allocated.

And even if the virtual console *could* be freed concurrently, then
these checks would be broken since they aren't done under console_lock,
and the vc_data is dereferenced before them anyway.

So, remove these unneeded checks to avoid confusion.

Signed-off-by: Eric Biggers <ebiggers@google.com>
Link: https://lore.kernel.org/r/20200224080326.295046-1-ebiggers@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/vt/vt_ioctl.c

index 09c2c91b1f800040476273b440ecdae5996d428a..476745cb806c8806cffa783399dfc940e5932246 100644 (file)
@@ -350,22 +350,13 @@ int vt_ioctl(struct tty_struct *tty,
 {
        struct vc_data *vc = tty->driver_data;
        struct console_font_op op;      /* used in multiple places here */
-       unsigned int console;
+       unsigned int console = vc->vc_num;
        unsigned char ucval;
        unsigned int uival;
        void __user *up = (void __user *)arg;
        int i, perm;
        int ret = 0;
 
-       console = vc->vc_num;
-
-
-       if (!vc_cons_allocated(console)) {      /* impossible? */
-               ret = -ENOIOCTLCMD;
-               goto out;
-       }
-
-
        /*
         * To have permissions to do most of the vt ioctls, we either have
         * to be the owner of the tty, or have CAP_SYS_TTY_CONFIG.
@@ -1195,18 +1186,10 @@ long vt_compat_ioctl(struct tty_struct *tty,
 {
        struct vc_data *vc = tty->driver_data;
        struct console_font_op op;      /* used in multiple places here */
-       unsigned int console;
        void __user *up = (void __user *)arg;
        int perm;
        int ret = 0;
 
-       console = vc->vc_num;
-
-       if (!vc_cons_allocated(console)) {      /* impossible? */
-               ret = -ENOIOCTLCMD;
-               goto out;
-       }
-
        /*
         * To have permissions to do most of the vt ioctls, we either have
         * to be the owner of the tty, or have CAP_SYS_TTY_CONFIG.
@@ -1266,7 +1249,7 @@ long vt_compat_ioctl(struct tty_struct *tty,
                arg = (unsigned long)compat_ptr(arg);
                goto fallback;
        }
-out:
+
        return ret;
 
 fallback: