Commit 8ada5f29 authored by Eric Biggers's avatar Eric Biggers Committed by Kelsey Skunberg

vt: vt_ioctl: remove unnecessary console allocation checks

BugLink: https://bugs.launchpad.net/bugs/1873852

commit 1aa6e058 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: default avatarEric Biggers <ebiggers@google.com>
Link: https://lore.kernel.org/r/20200224080326.295046-1-ebiggers@kernel.orgSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarKleber Sacilotto de Souza <kleber.souza@canonical.com>
Signed-off-by: default avatarKelsey Skunberg <kelsey.skunberg@canonical.com>
parent ff92e396
...@@ -353,22 +353,13 @@ int vt_ioctl(struct tty_struct *tty, ...@@ -353,22 +353,13 @@ int vt_ioctl(struct tty_struct *tty,
{ {
struct vc_data *vc = tty->driver_data; struct vc_data *vc = tty->driver_data;
struct console_font_op op; /* used in multiple places here */ struct console_font_op op; /* used in multiple places here */
unsigned int console; unsigned int console = vc->vc_num;
unsigned char ucval; unsigned char ucval;
unsigned int uival; unsigned int uival;
void __user *up = (void __user *)arg; void __user *up = (void __user *)arg;
int i, perm; int i, perm;
int ret = 0; 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 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. * to be the owner of the tty, or have CAP_SYS_TTY_CONFIG.
...@@ -1208,18 +1199,10 @@ long vt_compat_ioctl(struct tty_struct *tty, ...@@ -1208,18 +1199,10 @@ long vt_compat_ioctl(struct tty_struct *tty,
{ {
struct vc_data *vc = tty->driver_data; struct vc_data *vc = tty->driver_data;
struct console_font_op op; /* used in multiple places here */ struct console_font_op op; /* used in multiple places here */
unsigned int console;
void __user *up = (void __user *)arg; void __user *up = (void __user *)arg;
int perm; int perm;
int ret = 0; 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 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. * to be the owner of the tty, or have CAP_SYS_TTY_CONFIG.
...@@ -1279,7 +1262,7 @@ long vt_compat_ioctl(struct tty_struct *tty, ...@@ -1279,7 +1262,7 @@ long vt_compat_ioctl(struct tty_struct *tty,
arg = (unsigned long)compat_ptr(arg); arg = (unsigned long)compat_ptr(arg);
goto fallback; goto fallback;
} }
out:
return ret; return ret;
fallback: fallback:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment