diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2017-10-26 09:45:47 -0400 |
---|---|---|
committer | Kees Cook <keescook@chromium.org> | 2018-01-15 15:08:07 -0500 |
commit | 51776043afa415435c7e4636204fbe4f7edc4501 (patch) | |
tree | 7b3364b6df0e880aa682ec710a69b11953e4ad79 | |
parent | 46515736f8687c5dbde5637ca2f2678055c9c0f7 (diff) |
kvm: x86: fix KVM_XEN_HVM_CONFIG ioctl
This ioctl is obsolete (it was used by Xenner as far as I know) but
still let's not break it gratuitously... Its handler is copying
directly into struct kvm. Go through a bounce buffer instead, with
the added benefit that we can actually do something useful with the
flags argument---the previous code was exiting with -EINVAL but still
doing the copy.
This technically is a userspace ABI breakage, but since no one should be
using the ioctl, it's a good occasion to see if someone actually
complains.
Cc: kernel-hardening@lists.openwall.com
Cc: Kees Cook <keescook@chromium.org>
Cc: Radim Krčmář <rkrcmar@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Kees Cook <keescook@chromium.org>
-rw-r--r-- | arch/x86/kvm/x86.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index eee8e7faf1af..6c16461e3a86 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -4238,13 +4238,14 @@ set_identity_unlock: | |||
4238 | mutex_unlock(&kvm->lock); | 4238 | mutex_unlock(&kvm->lock); |
4239 | break; | 4239 | break; |
4240 | case KVM_XEN_HVM_CONFIG: { | 4240 | case KVM_XEN_HVM_CONFIG: { |
4241 | struct kvm_xen_hvm_config xhc; | ||
4241 | r = -EFAULT; | 4242 | r = -EFAULT; |
4242 | if (copy_from_user(&kvm->arch.xen_hvm_config, argp, | 4243 | if (copy_from_user(&xhc, argp, sizeof(xhc))) |
4243 | sizeof(struct kvm_xen_hvm_config))) | ||
4244 | goto out; | 4244 | goto out; |
4245 | r = -EINVAL; | 4245 | r = -EINVAL; |
4246 | if (kvm->arch.xen_hvm_config.flags) | 4246 | if (xhc.flags) |
4247 | goto out; | 4247 | goto out; |
4248 | memcpy(&kvm->arch.xen_hvm_config, &xhc, sizeof(xhc)); | ||
4248 | r = 0; | 4249 | r = 0; |
4249 | break; | 4250 | break; |
4250 | } | 4251 | } |