tty: vt: push console lock from tioclinux() down to 2 functions
authorJiri Slaby (SUSE) <jirislaby@kernel.org>
Mon, 22 Jan 2024 11:03:20 +0000 (12:03 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 28 Jan 2024 02:08:52 +0000 (18:08 -0800)
Avoid costly user copies under the console lock. So push the lock down
from tioclinux() to sel_loadlut() and set_vesa_blanking().

It is now obvious what is actually protected.

Signed-off-by: "Jiri Slaby (SUSE)" <jirislaby@kernel.org>
Tested-by: Helge Deller <deller@gmx.de> # parisc STI console
Link: https://lore.kernel.org/r/20240122110401.7289-7-jirislaby@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/vt/selection.c
drivers/tty/vt/vt.c

index e172ede235a0965408f0a63688c46634da721072..91d789c025c6c961be780543a882819df5e303b1 100644 (file)
@@ -113,15 +113,22 @@ static inline int inword(const u32 c)
  *     sel_loadlut()           -       load the LUT table
  *     @lut: user table
  *
- *     Load the LUT table from user space. The caller must hold the console
- *     lock. Make a temporary copy so a partial update doesn't make a mess.
+ *     Load the LUT table from user space. Make a temporary copy so a partial
+ *     update doesn't make a mess.
+ *
+ *     Locking: The console lock is acquired.
  */
 int sel_loadlut(u32 __user *lut)
 {
        u32 tmplut[ARRAY_SIZE(inwordLut)];
+
        if (copy_from_user(tmplut, lut, sizeof(inwordLut)))
                return -EFAULT;
+
+       console_lock();
        memcpy(inwordLut, tmplut, sizeof(inwordLut));
+       console_unlock();
+
        return 0;
 }
 
index 079dbff562fd2a95f9961a6fdbd3117cbc63fada..3a6f60ad2224c789c6e52b41ffba12e46863e32f 100644 (file)
@@ -3162,10 +3162,7 @@ int tioclinux(struct tty_struct *tty, unsigned long arg)
        case TIOCL_SELLOADLUT:
                if (!capable(CAP_SYS_ADMIN))
                        return -EPERM;
-               console_lock();
-               ret = sel_loadlut(param_aligned32);
-               console_unlock();
-               break;
+               return sel_loadlut(param_aligned32);
        case TIOCL_GETSHIFTSTATE:
                /*
                 * Make it possible to react to Shift+Mousebutton. Note that
@@ -3181,10 +3178,7 @@ int tioclinux(struct tty_struct *tty, unsigned long arg)
                console_unlock();
                return put_user(data, p);
        case TIOCL_SETVESABLANK:
-               console_lock();
-               ret = set_vesa_blanking(param);
-               console_unlock();
-               break;
+               return set_vesa_blanking(param);
        case TIOCL_GETKMSGREDIRECT:
                data = vt_get_kmsg_redirect();
                return put_user(data, p);
@@ -4270,7 +4264,10 @@ static int set_vesa_blanking(u8 __user *mode_user)
        if (get_user(mode, mode_user))
                return -EFAULT;
 
+       console_lock();
        vesa_blank_mode = (mode < 4) ? mode : 0;
+       console_unlock();
+
        return 0;
 }