x86/fpu: Cleanup arch_set_user_pkey_access()
authorThomas Gleixner <tglx@linutronix.de>
Wed, 23 Jun 2021 12:01:50 +0000 (14:01 +0200)
committerBorislav Petkov <bp@suse.de>
Wed, 23 Jun 2021 15:52:41 +0000 (17:52 +0200)
The function does a sanity check with a WARN_ON_ONCE() but happily proceeds
when the pkey argument is out of range.

Clean it up.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Borislav Petkov <bp@suse.de>
Link: https://lkml.kernel.org/r/20210623121453.635764326@linutronix.de
arch/x86/kernel/fpu/xstate.c

index 185cc5d..579e343 100644 (file)
@@ -912,11 +912,10 @@ EXPORT_SYMBOL_GPL(get_xsave_addr);
  * rights for @pkey to @init_val.
  */
 int arch_set_user_pkey_access(struct task_struct *tsk, int pkey,
-               unsigned long init_val)
+                             unsigned long init_val)
 {
-       u32 old_pkru;
-       int pkey_shift = (pkey * PKRU_BITS_PER_PKEY);
-       u32 new_pkru_bits = 0;
+       u32 old_pkru, new_pkru_bits = 0;
+       int pkey_shift;
 
        /*
         * This check implies XSAVE support.  OSPKE only gets
@@ -930,7 +929,8 @@ int arch_set_user_pkey_access(struct task_struct *tsk, int pkey,
         * values originating from in-kernel users.  Complain
         * if a bad value is observed.
         */
-       WARN_ON_ONCE(pkey >= arch_max_pkey());
+       if (WARN_ON_ONCE(pkey >= arch_max_pkey()))
+               return -EINVAL;
 
        /* Set the bits we need in PKRU:  */
        if (init_val & PKEY_DISABLE_ACCESS)
@@ -939,6 +939,7 @@ int arch_set_user_pkey_access(struct task_struct *tsk, int pkey,
                new_pkru_bits |= PKRU_WD_BIT;
 
        /* Shift the bits in to the correct place in PKRU for pkey: */
+       pkey_shift = pkey * PKRU_BITS_PER_PKEY;
        new_pkru_bits <<= pkey_shift;
 
        /* Get old PKRU and mask off any old bits in place: */