diff options
Diffstat (limited to 'virt')
| -rw-r--r-- | virt/kvm/kvm_main.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 58146457bf97..ed3c4e7c1008 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
| @@ -648,7 +648,10 @@ int __kvm_set_memory_region(struct kvm *kvm, | |||
| 648 | goto out; | 648 | goto out; |
| 649 | if (mem->guest_phys_addr & (PAGE_SIZE - 1)) | 649 | if (mem->guest_phys_addr & (PAGE_SIZE - 1)) |
| 650 | goto out; | 650 | goto out; |
| 651 | if (user_alloc && (mem->userspace_addr & (PAGE_SIZE - 1))) | 651 | /* We can read the guest memory with __xxx_user() later on. */ |
| 652 | if (user_alloc && | ||
| 653 | ((mem->userspace_addr & (PAGE_SIZE - 1)) || | ||
| 654 | !access_ok(VERIFY_WRITE, mem->userspace_addr, mem->memory_size))) | ||
| 652 | goto out; | 655 | goto out; |
| 653 | if (mem->slot >= KVM_MEMORY_SLOTS + KVM_PRIVATE_MEM_SLOTS) | 656 | if (mem->slot >= KVM_MEMORY_SLOTS + KVM_PRIVATE_MEM_SLOTS) |
| 654 | goto out; | 657 | goto out; |
| @@ -1283,7 +1286,7 @@ int kvm_read_guest_page(struct kvm *kvm, gfn_t gfn, void *data, int offset, | |||
| 1283 | addr = gfn_to_hva(kvm, gfn); | 1286 | addr = gfn_to_hva(kvm, gfn); |
| 1284 | if (kvm_is_error_hva(addr)) | 1287 | if (kvm_is_error_hva(addr)) |
| 1285 | return -EFAULT; | 1288 | return -EFAULT; |
| 1286 | r = copy_from_user(data, (void __user *)addr + offset, len); | 1289 | r = __copy_from_user(data, (void __user *)addr + offset, len); |
| 1287 | if (r) | 1290 | if (r) |
| 1288 | return -EFAULT; | 1291 | return -EFAULT; |
| 1289 | return 0; | 1292 | return 0; |
