vt_kdsetmode: extend console locking

As per the long-suffering comment.

Reported-by: Minh Yuan <yuanmingbuaa@gmail.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Jiri Slaby <jirislaby@kernel.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Linus Torvalds 2021-08-30 08:55:18 -07:00
parent 3a2b2eb556
commit 2287a51ba8

View file

@ -246,6 +246,8 @@ int vt_waitactive(int n)
* *
* XXX It should at least call into the driver, fbdev's definitely need to * XXX It should at least call into the driver, fbdev's definitely need to
* restore their engine state. --BenH * restore their engine state. --BenH
*
* Called with the console lock held.
*/ */
static int vt_kdsetmode(struct vc_data *vc, unsigned long mode) static int vt_kdsetmode(struct vc_data *vc, unsigned long mode)
{ {
@ -262,7 +264,6 @@ static int vt_kdsetmode(struct vc_data *vc, unsigned long mode)
return -EINVAL; return -EINVAL;
} }
/* FIXME: this needs the console lock extending */
if (vc->vc_mode == mode) if (vc->vc_mode == mode)
return 0; return 0;
@ -271,12 +272,10 @@ static int vt_kdsetmode(struct vc_data *vc, unsigned long mode)
return 0; return 0;
/* explicitly blank/unblank the screen if switching modes */ /* explicitly blank/unblank the screen if switching modes */
console_lock();
if (mode == KD_TEXT) if (mode == KD_TEXT)
do_unblank_screen(1); do_unblank_screen(1);
else else
do_blank_screen(1); do_blank_screen(1);
console_unlock();
return 0; return 0;
} }
@ -378,7 +377,10 @@ static int vt_k_ioctl(struct tty_struct *tty, unsigned int cmd,
if (!perm) if (!perm)
return -EPERM; return -EPERM;
return vt_kdsetmode(vc, arg); console_lock();
ret = vt_kdsetmode(vc, arg);
console_unlock();
return ret;
case KDGETMODE: case KDGETMODE:
return put_user(vc->vc_mode, (int __user *)arg); return put_user(vc->vc_mode, (int __user *)arg);