FAILED: patch "[PATCH] x86/fpu: Reset state for all signal restore failures" failed to apply to 4.14-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.14-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From efa165504943f2128d50f63de0c02faf6dcceb0d Mon Sep 17 00:00:00 2001
From: Thomas Gleixner <[email protected]>
Date: Wed, 9 Jun 2021 21:18:00 +0200
Subject: [PATCH] x86/fpu: Reset state for all signal restore failures
If access_ok() or fpregs_soft_set() fails in __fpu__restore_sig() then the function just returns but does not clear the FPU state as it does for all other fatal failures.
Clear the FPU state for these failures as well.
Fixes 72a671ced66d ("x86, fpu: Unify signal handling code paths for x86 and x86_64 kernels")
Signed-off-by Thomas Gleixner <[email protected]>
Signed-off-by Borislav Petkov <[email protected]>
arch/x86/kernel/fpu/signal.c +15 -11
@@ -307,13 +307,17 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size)return 0 ; } -if (!access_ok (buf, size)) -return -EACCES ; +if (!access_ok (buf, size)) { + ret = -EACCES ; + goto out; + } -if (!static_cpu_has (X86_FEATURE_FPU )) -return fpregs_soft_set (current,NULL , -0 ,sizeof (struct user_i387_ia32_struct ), -NULL , buf) !=0 ; +if (!static_cpu_has (X86_FEATURE_FPU )) { + ret =fpregs_soft_set (current,NULL ,0 , +sizeof (struct user_i387_ia32_struct ), +NULL , buf); + goto out; + }if (use_xsave ()) {struct _fpx_sw_bytes fx_sw_user;
@@ -396,7 +400,7 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size)*/ ret =__copy_from_user (&env, buf,sizeof (env));if (ret) - goto err_out; + goto out; envp = &env; }
@@ -426,7 +430,7 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size) ret =copy_user_to_xstate (&fpu->state.xsave, buf_fx);if (ret) - goto err_out; + goto out;sanitize_restored_user_xstate (&fpu->state, envp, user_xfeatures, fx_only);
@@ -446,7 +450,7 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size) ret =__copy_from_user (&fpu->state.fxsave, buf_fx, state_size);if (ret) { ret = -EFAULT ; - goto err_out; + goto out; } sanitize_restored_user_xstate(&fpu->state, envp, user_xfeatures,
@@ -464,7 +468,7 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size) }else { ret =__copy_from_user (&fpu->state.fsave, buf_fx, state_size);if (ret) - goto err_out; + goto out;fpregs_lock (); ret =copy_kernel_to_fregs_err (&fpu->state.fsave);
@@ -475,7 +479,7 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size)fpregs_deactivate (fpu);fpregs_unlock (); -err_out: +out:if (ret)fpu__clear_user_states (fpu);return ret;