diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2020-02-21 06:11:55 +0100 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2020-06-26 07:01:33 +0200 |
commit | 36c8673f90c8e244b10d1905eb08f4f61c033a25 (patch) | |
tree | 8016cdb056ecd55e7bbb70632bf4195933bdc923 /arch/x86/kernel/fpu/signal.c | |
parent | Linux 5.8-rc1 (diff) | |
download | linux-36c8673f90c8e244b10d1905eb08f4f61c033a25.tar.xz linux-36c8673f90c8e244b10d1905eb08f4f61c033a25.zip |
x86: copy_fpstate_to_sigframe(): have fpregs_soft_get() use kernel buffer
... then copy_to_user() the results
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to '')
-rw-r--r-- | arch/x86/kernel/fpu/signal.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/arch/x86/kernel/fpu/signal.c b/arch/x86/kernel/fpu/signal.c index 9393a445d73c..e0b832df7404 100644 --- a/arch/x86/kernel/fpu/signal.c +++ b/arch/x86/kernel/fpu/signal.c @@ -170,14 +170,14 @@ int copy_fpstate_to_sigframe(void __user *buf, void __user *buf_fx, int size) ia32_fxstate &= (IS_ENABLED(CONFIG_X86_32) || IS_ENABLED(CONFIG_IA32_EMULATION)); + if (!static_cpu_has(X86_FEATURE_FPU)) { + struct user_i387_ia32_struct fp; + fpregs_soft_get(current, NULL, 0, sizeof(fp), &fp, NULL); + return copy_to_user(buf, &fp, sizeof(fp)) ? -EFAULT : 0; + } + if (!access_ok(buf, size)) return -EACCES; - - if (!static_cpu_has(X86_FEATURE_FPU)) - return fpregs_soft_get(current, NULL, 0, - sizeof(struct user_i387_ia32_struct), NULL, - (struct _fpstate_32 __user *) buf) ? -1 : 1; - retry: /* * Load the FPU registers if they are not valid for the current task. |