KVM: x86: Copy filter arg outside kvm_vm_ioctl_set_msr_filter()

In the next patch we want to introduce a second caller to
set_msr_filter() which constructs its own filter list on the stack.
Refactor the original function so it takes it as argument instead of
reading it through copy_from_user().

Signed-off-by: Alexander Graf <graf@amazon.com>
Message-Id: <20221017184541.2658-3-graf@amazon.com>
Cc: stable@vger.kernel.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

authored by Alexander Graf and committed by Paolo Bonzini 2e3272bc ed51862f

Changed files
+17 -14
arch
x86
kvm
+17 -14
arch/x86/kvm/x86.c
··· 6442 6442 return 0; 6443 6443 } 6444 6444 6445 - static int kvm_vm_ioctl_set_msr_filter(struct kvm *kvm, void __user *argp) 6445 + static int kvm_vm_ioctl_set_msr_filter(struct kvm *kvm, 6446 + struct kvm_msr_filter *filter) 6446 6447 { 6447 - struct kvm_msr_filter __user *user_msr_filter = argp; 6448 6448 struct kvm_x86_msr_filter *new_filter, *old_filter; 6449 - struct kvm_msr_filter filter; 6450 6449 bool default_allow; 6451 6450 bool empty = true; 6452 6451 int r = 0; 6453 6452 u32 i; 6454 6453 6455 - if (copy_from_user(&filter, user_msr_filter, sizeof(filter))) 6456 - return -EFAULT; 6457 - 6458 - if (filter.flags & ~KVM_MSR_FILTER_DEFAULT_DENY) 6454 + if (filter->flags & ~KVM_MSR_FILTER_DEFAULT_DENY) 6459 6455 return -EINVAL; 6460 6456 6461 - for (i = 0; i < ARRAY_SIZE(filter.ranges); i++) 6462 - empty &= !filter.ranges[i].nmsrs; 6457 + for (i = 0; i < ARRAY_SIZE(filter->ranges); i++) 6458 + empty &= !filter->ranges[i].nmsrs; 6463 6459 6464 - default_allow = !(filter.flags & KVM_MSR_FILTER_DEFAULT_DENY); 6460 + default_allow = !(filter->flags & KVM_MSR_FILTER_DEFAULT_DENY); 6465 6461 if (empty && !default_allow) 6466 6462 return -EINVAL; 6467 6463 ··· 6465 6469 if (!new_filter) 6466 6470 return -ENOMEM; 6467 6471 6468 - for (i = 0; i < ARRAY_SIZE(filter.ranges); i++) { 6469 - r = kvm_add_msr_filter(new_filter, &filter.ranges[i]); 6472 + for (i = 0; i < ARRAY_SIZE(filter->ranges); i++) { 6473 + r = kvm_add_msr_filter(new_filter, &filter->ranges[i]); 6470 6474 if (r) { 6471 6475 kvm_free_msr_filter(new_filter); 6472 6476 return r; ··· 6911 6915 case KVM_SET_PMU_EVENT_FILTER: 6912 6916 r = kvm_vm_ioctl_set_pmu_event_filter(kvm, argp); 6913 6917 break; 6914 - case KVM_X86_SET_MSR_FILTER: 6915 - r = kvm_vm_ioctl_set_msr_filter(kvm, argp); 6918 + case KVM_X86_SET_MSR_FILTER: { 6919 + struct kvm_msr_filter __user *user_msr_filter = argp; 6920 + struct kvm_msr_filter filter; 6921 + 6922 + if (copy_from_user(&filter, user_msr_filter, sizeof(filter))) 6923 + return -EFAULT; 6924 + 6925 + r = kvm_vm_ioctl_set_msr_filter(kvm, &filter); 6916 6926 break; 6927 + } 6917 6928 default: 6918 6929 r = -ENOTTY; 6919 6930 }