aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kvm/x86.c82
-rw-r--r--virt/kvm/kvm_main.c29
2 files changed, 47 insertions, 64 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 03042d60a8fc..0a646e2b57c5 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -1309,12 +1309,11 @@ static int xen_hvm_config(struct kvm_vcpu *vcpu, u64 data)
1309 if (page_num >= blob_size) 1309 if (page_num >= blob_size)
1310 goto out; 1310 goto out;
1311 r = -ENOMEM; 1311 r = -ENOMEM;
1312 page = kzalloc(PAGE_SIZE, GFP_KERNEL); 1312 page = memdup_user(blob_addr + (page_num * PAGE_SIZE), PAGE_SIZE);
1313 if (!page) 1313 if (IS_ERR(page)) {
1314 r = PTR_ERR(page);
1314 goto out; 1315 goto out;
1315 r = -EFAULT; 1316 }
1316 if (copy_from_user(page, blob_addr + (page_num * PAGE_SIZE), PAGE_SIZE))
1317 goto out_free;
1318 if (kvm_write_guest(kvm, page_addr, page, PAGE_SIZE)) 1317 if (kvm_write_guest(kvm, page_addr, page, PAGE_SIZE))
1319 goto out_free; 1318 goto out_free;
1320 r = 0; 1319 r = 0;
@@ -1988,15 +1987,12 @@ static int msr_io(struct kvm_vcpu *vcpu, struct kvm_msrs __user *user_msrs,
1988 if (msrs.nmsrs >= MAX_IO_MSRS) 1987 if (msrs.nmsrs >= MAX_IO_MSRS)
1989 goto out; 1988 goto out;
1990 1989
1991 r = -ENOMEM;
1992 size = sizeof(struct kvm_msr_entry) * msrs.nmsrs; 1990 size = sizeof(struct kvm_msr_entry) * msrs.nmsrs;
1993 entries = kmalloc(size, GFP_KERNEL); 1991 entries = memdup_user(user_msrs->entries, size);
1994 if (!entries) 1992 if (IS_ERR(entries)) {
1993 r = PTR_ERR(entries);
1995 goto out; 1994 goto out;
1996 1995 }
1997 r = -EFAULT;
1998 if (copy_from_user(entries, user_msrs->entries, size))
1999 goto out_free;
2000 1996
2001 r = n = __msr_io(vcpu, &msrs, entries, do_msr); 1997 r = n = __msr_io(vcpu, &msrs, entries, do_msr);
2002 if (r < 0) 1998 if (r < 0)
@@ -2533,13 +2529,12 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
2533 r = -EINVAL; 2529 r = -EINVAL;
2534 if (!vcpu->arch.apic) 2530 if (!vcpu->arch.apic)
2535 goto out; 2531 goto out;
2536 u.lapic = kmalloc(sizeof(struct kvm_lapic_state), GFP_KERNEL); 2532 u.lapic = memdup_user(argp, sizeof(*u.lapic));
2537 r = -ENOMEM; 2533 if (IS_ERR(u.lapic)) {
2538 if (!u.lapic) 2534 r = PTR_ERR(u.lapic);
2539 goto out;
2540 r = -EFAULT;
2541 if (copy_from_user(u.lapic, argp, sizeof(struct kvm_lapic_state)))
2542 goto out; 2535 goto out;
2536 }
2537
2543 r = kvm_vcpu_ioctl_set_lapic(vcpu, u.lapic); 2538 r = kvm_vcpu_ioctl_set_lapic(vcpu, u.lapic);
2544 if (r) 2539 if (r)
2545 goto out; 2540 goto out;
@@ -2718,14 +2713,11 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
2718 break; 2713 break;
2719 } 2714 }
2720 case KVM_SET_XSAVE: { 2715 case KVM_SET_XSAVE: {
2721 u.xsave = kzalloc(sizeof(struct kvm_xsave), GFP_KERNEL); 2716 u.xsave = memdup_user(argp, sizeof(*u.xsave));
2722 r = -ENOMEM; 2717 if (IS_ERR(u.xsave)) {
2723 if (!u.xsave) 2718 r = PTR_ERR(u.xsave);
2724 break; 2719 goto out;
2725 2720 }
2726 r = -EFAULT;
2727 if (copy_from_user(u.xsave, argp, sizeof(struct kvm_xsave)))
2728 break;
2729 2721
2730 r = kvm_vcpu_ioctl_x86_set_xsave(vcpu, u.xsave); 2722 r = kvm_vcpu_ioctl_x86_set_xsave(vcpu, u.xsave);
2731 break; 2723 break;
@@ -2746,15 +2738,11 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
2746 break; 2738 break;
2747 } 2739 }
2748 case KVM_SET_XCRS: { 2740 case KVM_SET_XCRS: {
2749 u.xcrs = kzalloc(sizeof(struct kvm_xcrs), GFP_KERNEL); 2741 u.xcrs = memdup_user(argp, sizeof(*u.xcrs));
2750 r = -ENOMEM; 2742 if (IS_ERR(u.xcrs)) {
2751 if (!u.xcrs) 2743 r = PTR_ERR(u.xcrs);
2752 break; 2744 goto out;
2753 2745 }
2754 r = -EFAULT;
2755 if (copy_from_user(u.xcrs, argp,
2756 sizeof(struct kvm_xcrs)))
2757 break;
2758 2746
2759 r = kvm_vcpu_ioctl_x86_set_xcrs(vcpu, u.xcrs); 2747 r = kvm_vcpu_ioctl_x86_set_xcrs(vcpu, u.xcrs);
2760 break; 2748 break;
@@ -3190,14 +3178,14 @@ long kvm_arch_vm_ioctl(struct file *filp,
3190 } 3178 }
3191 case KVM_GET_IRQCHIP: { 3179 case KVM_GET_IRQCHIP: {
3192 /* 0: PIC master, 1: PIC slave, 2: IOAPIC */ 3180 /* 0: PIC master, 1: PIC slave, 2: IOAPIC */
3193 struct kvm_irqchip *chip = kmalloc(sizeof(*chip), GFP_KERNEL); 3181 struct kvm_irqchip *chip;
3194 3182
3195 r = -ENOMEM; 3183 chip = memdup_user(argp, sizeof(*chip));
3196 if (!chip) 3184 if (IS_ERR(chip)) {
3185 r = PTR_ERR(chip);
3197 goto out; 3186 goto out;
3198 r = -EFAULT; 3187 }
3199 if (copy_from_user(chip, argp, sizeof *chip)) 3188
3200 goto get_irqchip_out;
3201 r = -ENXIO; 3189 r = -ENXIO;
3202 if (!irqchip_in_kernel(kvm)) 3190 if (!irqchip_in_kernel(kvm))
3203 goto get_irqchip_out; 3191 goto get_irqchip_out;
@@ -3216,14 +3204,14 @@ long kvm_arch_vm_ioctl(struct file *filp,
3216 } 3204 }
3217 case KVM_SET_IRQCHIP: { 3205 case KVM_SET_IRQCHIP: {
3218 /* 0: PIC master, 1: PIC slave, 2: IOAPIC */ 3206 /* 0: PIC master, 1: PIC slave, 2: IOAPIC */
3219 struct kvm_irqchip *chip = kmalloc(sizeof(*chip), GFP_KERNEL); 3207 struct kvm_irqchip *chip;
3220 3208
3221 r = -ENOMEM; 3209 chip = memdup_user(argp, sizeof(*chip));
3222 if (!chip) 3210 if (IS_ERR(chip)) {
3211 r = PTR_ERR(chip);
3223 goto out; 3212 goto out;
3224 r = -EFAULT; 3213 }
3225 if (copy_from_user(chip, argp, sizeof *chip)) 3214
3226 goto set_irqchip_out;
3227 r = -ENXIO; 3215 r = -ENXIO;
3228 if (!irqchip_in_kernel(kvm)) 3216 if (!irqchip_in_kernel(kvm))
3229 goto set_irqchip_out; 3217 goto set_irqchip_out;
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index a6e612fced73..d8bac0751666 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -1821,12 +1821,11 @@ out_free1:
1821 struct kvm_regs *kvm_regs; 1821 struct kvm_regs *kvm_regs;
1822 1822
1823 r = -ENOMEM; 1823 r = -ENOMEM;
1824 kvm_regs = kzalloc(sizeof(struct kvm_regs), GFP_KERNEL); 1824 kvm_regs = memdup_user(argp, sizeof(*kvm_regs));
1825 if (!kvm_regs) 1825 if (IS_ERR(kvm_regs)) {
1826 r = PTR_ERR(kvm_regs);
1826 goto out; 1827 goto out;
1827 r = -EFAULT; 1828 }
1828 if (copy_from_user(kvm_regs, argp, sizeof(struct kvm_regs)))
1829 goto out_free2;
1830 r = kvm_arch_vcpu_ioctl_set_regs(vcpu, kvm_regs); 1829 r = kvm_arch_vcpu_ioctl_set_regs(vcpu, kvm_regs);
1831 if (r) 1830 if (r)
1832 goto out_free2; 1831 goto out_free2;
@@ -1850,13 +1849,11 @@ out_free2:
1850 break; 1849 break;
1851 } 1850 }
1852 case KVM_SET_SREGS: { 1851 case KVM_SET_SREGS: {
1853 kvm_sregs = kmalloc(sizeof(struct kvm_sregs), GFP_KERNEL); 1852 kvm_sregs = memdup_user(argp, sizeof(*kvm_sregs));
1854 r = -ENOMEM; 1853 if (IS_ERR(kvm_sregs)) {
1855 if (!kvm_sregs) 1854 r = PTR_ERR(kvm_sregs);
1856 goto out;
1857 r = -EFAULT;
1858 if (copy_from_user(kvm_sregs, argp, sizeof(struct kvm_sregs)))
1859 goto out; 1855 goto out;
1856 }
1860 r = kvm_arch_vcpu_ioctl_set_sregs(vcpu, kvm_sregs); 1857 r = kvm_arch_vcpu_ioctl_set_sregs(vcpu, kvm_sregs);
1861 if (r) 1858 if (r)
1862 goto out; 1859 goto out;
@@ -1952,13 +1949,11 @@ out_free2:
1952 break; 1949 break;
1953 } 1950 }
1954 case KVM_SET_FPU: { 1951 case KVM_SET_FPU: {
1955 fpu = kmalloc(sizeof(struct kvm_fpu), GFP_KERNEL); 1952 fpu = memdup_user(argp, sizeof(*fpu));
1956 r = -ENOMEM; 1953 if (IS_ERR(fpu)) {
1957 if (!fpu) 1954 r = PTR_ERR(fpu);
1958 goto out;
1959 r = -EFAULT;
1960 if (copy_from_user(fpu, argp, sizeof(struct kvm_fpu)))
1961 goto out; 1955 goto out;
1956 }
1962 r = kvm_arch_vcpu_ioctl_set_fpu(vcpu, fpu); 1957 r = kvm_arch_vcpu_ioctl_set_fpu(vcpu, fpu);
1963 if (r) 1958 if (r)
1964 goto out; 1959 goto out;