x86/fpu/signal: Change return code of restore_fpregs_from_user() to boolean
authorThomas Gleixner <tglx@linutronix.de>
Wed, 8 Sep 2021 13:29:41 +0000 (15:29 +0200)
committerBorislav Petkov <bp@suse.de>
Tue, 14 Sep 2021 19:10:04 +0000 (21:10 +0200)
__fpu_sig_restore() only needs information about success or fail and no
real error code.

This cleans up the confusing conversion of the trap number, which is
returned by the *RSTOR() exception fixups, to an error code.

Suggested-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Borislav Petkov <bp@suse.de>
Link: https://lkml.kernel.org/r/20210908132526.084109938@linutronix.de
arch/x86/kernel/fpu/signal.c

index 2bd4d51f985e58d30fdee8cb0f5553022b9684c7..68f03da2012eddf3ecd866870d573824adff1076 100644 (file)
@@ -254,8 +254,8 @@ static int __restore_fpregs_from_user(void __user *buf, u64 xrestore,
  * Attempt to restore the FPU registers directly from user memory.
  * Pagefaults are handled and any errors returned are fatal.
  */
-static int restore_fpregs_from_user(void __user *buf, u64 xrestore,
-                                   bool fx_only, unsigned int size)
+static bool restore_fpregs_from_user(void __user *buf, u64 xrestore,
+                                    bool fx_only, unsigned int size)
 {
        struct fpu *fpu = &current->thread.fpu;
        int ret;
@@ -284,12 +284,11 @@ retry:
 
                /* Try to handle #PF, but anything else is fatal. */
                if (ret != X86_TRAP_PF)
-                       return -EINVAL;
+                       return false;
 
-               ret = fault_in_pages_readable(buf, size);
-               if (!ret)
+               if (!fault_in_pages_readable(buf, size))
                        goto retry;
-               return ret;
+               return false;
        }
 
        /*
@@ -306,7 +305,7 @@ retry:
 
        fpregs_mark_activate();
        fpregs_unlock();
-       return 0;
+       return true;
 }
 
 static bool __fpu_restore_sig(void __user *buf, void __user *buf_fx,
@@ -341,8 +340,8 @@ static bool __fpu_restore_sig(void __user *buf, void __user *buf_fx,
                 * faults. If it does, fall back to the slow path below, going
                 * through the kernel buffer with the enabled pagefault handler.
                 */
-               return !restore_fpregs_from_user(buf_fx, user_xfeatures, fx_only,
-                                                state_size);
+               return restore_fpregs_from_user(buf_fx, user_xfeatures, fx_only,
+                                               state_size);
        }
 
        /*