Re: [PATCH v4] KVM: x86: Fix KVM_GET_CPUID2 ioctl to return cpuid entries count

From: Sean Christopherson
Date: Wed Apr 28 2021 - 21:00:15 EST


On Wed, Apr 28, 2021, Valeriy Vdovin wrote:
> It's very explicit by the code that it was designed to receive some
> small number of entries to return E2BIG along with the corrected number.

LOL, saying KVM_GET_CPUID2 was "designed" is definitely giving the KVM
forefathers the benefit of the doubt.

> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index efc7a82ab140..3f941b1f4e78 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -4773,14 +4773,17 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
> r = -EFAULT;
> if (copy_from_user(&cpuid, cpuid_arg, sizeof(cpuid)))
> goto out;
> +
> r = kvm_vcpu_ioctl_get_cpuid2(vcpu, &cpuid,
> cpuid_arg->entries);
> - if (r)
> +
> + if (r && r != -E2BIG)
> goto out;
> - r = -EFAULT;
> - if (copy_to_user(cpuid_arg, &cpuid, sizeof(cpuid)))
> +
> + if (copy_to_user(cpuid_arg, &cpuid, sizeof(cpuid))) {
> + r = -EFAULT;
> goto out;

As I pointed out[*], copying the number of entries but not the entries themselves
is wrong. All of my feedback on v1 still stands.

[*] https://lkml.kernel.org/r/YIl4M/GgaYvwNuXv@xxxxxxxxxx

> - r = 0;
> + }
> break;
> }
> case KVM_GET_MSRS: {