diff options
| -rw-r--r-- | arch/x86/kvm/cpuid.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c index 769af907f824..7597b42a8a88 100644 --- a/arch/x86/kvm/cpuid.c +++ b/arch/x86/kvm/cpuid.c | |||
| @@ -181,19 +181,22 @@ int kvm_vcpu_ioctl_set_cpuid(struct kvm_vcpu *vcpu, | |||
| 181 | struct kvm_cpuid_entry __user *entries) | 181 | struct kvm_cpuid_entry __user *entries) |
| 182 | { | 182 | { |
| 183 | int r, i; | 183 | int r, i; |
| 184 | struct kvm_cpuid_entry *cpuid_entries; | 184 | struct kvm_cpuid_entry *cpuid_entries = NULL; |
| 185 | 185 | ||
| 186 | r = -E2BIG; | 186 | r = -E2BIG; |
| 187 | if (cpuid->nent > KVM_MAX_CPUID_ENTRIES) | 187 | if (cpuid->nent > KVM_MAX_CPUID_ENTRIES) |
| 188 | goto out; | 188 | goto out; |
| 189 | r = -ENOMEM; | 189 | r = -ENOMEM; |
| 190 | cpuid_entries = vmalloc(sizeof(struct kvm_cpuid_entry) * cpuid->nent); | 190 | if (cpuid->nent) { |
| 191 | if (!cpuid_entries) | 191 | cpuid_entries = vmalloc(sizeof(struct kvm_cpuid_entry) * |
| 192 | goto out; | 192 | cpuid->nent); |
| 193 | r = -EFAULT; | 193 | if (!cpuid_entries) |
| 194 | if (copy_from_user(cpuid_entries, entries, | 194 | goto out; |
| 195 | cpuid->nent * sizeof(struct kvm_cpuid_entry))) | 195 | r = -EFAULT; |
| 196 | goto out_free; | 196 | if (copy_from_user(cpuid_entries, entries, |
| 197 | cpuid->nent * sizeof(struct kvm_cpuid_entry))) | ||
| 198 | goto out; | ||
| 199 | } | ||
| 197 | for (i = 0; i < cpuid->nent; i++) { | 200 | for (i = 0; i < cpuid->nent; i++) { |
| 198 | vcpu->arch.cpuid_entries[i].function = cpuid_entries[i].function; | 201 | vcpu->arch.cpuid_entries[i].function = cpuid_entries[i].function; |
| 199 | vcpu->arch.cpuid_entries[i].eax = cpuid_entries[i].eax; | 202 | vcpu->arch.cpuid_entries[i].eax = cpuid_entries[i].eax; |
| @@ -212,9 +215,8 @@ int kvm_vcpu_ioctl_set_cpuid(struct kvm_vcpu *vcpu, | |||
| 212 | kvm_x86_ops->cpuid_update(vcpu); | 215 | kvm_x86_ops->cpuid_update(vcpu); |
| 213 | r = kvm_update_cpuid(vcpu); | 216 | r = kvm_update_cpuid(vcpu); |
| 214 | 217 | ||
| 215 | out_free: | ||
| 216 | vfree(cpuid_entries); | ||
| 217 | out: | 218 | out: |
| 219 | vfree(cpuid_entries); | ||
| 218 | return r; | 220 | return r; |
| 219 | } | 221 | } |
| 220 | 222 | ||
