diff options
Diffstat (limited to 'virt/kvm/kvm_main.c')
| -rw-r--r-- | virt/kvm/kvm_main.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 1f888a103f78..585845203db8 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
| @@ -1227,9 +1227,9 @@ int kvm_clear_dirty_log_protect(struct kvm *kvm, | |||
| 1227 | { | 1227 | { |
| 1228 | struct kvm_memslots *slots; | 1228 | struct kvm_memslots *slots; |
| 1229 | struct kvm_memory_slot *memslot; | 1229 | struct kvm_memory_slot *memslot; |
| 1230 | int as_id, id, n; | 1230 | int as_id, id; |
| 1231 | gfn_t offset; | 1231 | gfn_t offset; |
| 1232 | unsigned long i; | 1232 | unsigned long i, n; |
| 1233 | unsigned long *dirty_bitmap; | 1233 | unsigned long *dirty_bitmap; |
| 1234 | unsigned long *dirty_bitmap_buffer; | 1234 | unsigned long *dirty_bitmap_buffer; |
| 1235 | 1235 | ||
| @@ -1249,6 +1249,11 @@ int kvm_clear_dirty_log_protect(struct kvm *kvm, | |||
| 1249 | return -ENOENT; | 1249 | return -ENOENT; |
| 1250 | 1250 | ||
| 1251 | n = kvm_dirty_bitmap_bytes(memslot); | 1251 | n = kvm_dirty_bitmap_bytes(memslot); |
| 1252 | |||
| 1253 | if (log->first_page > memslot->npages || | ||
| 1254 | log->num_pages > memslot->npages - log->first_page) | ||
| 1255 | return -EINVAL; | ||
| 1256 | |||
| 1252 | *flush = false; | 1257 | *flush = false; |
| 1253 | dirty_bitmap_buffer = kvm_second_dirty_bitmap(memslot); | 1258 | dirty_bitmap_buffer = kvm_second_dirty_bitmap(memslot); |
| 1254 | if (copy_from_user(dirty_bitmap_buffer, log->dirty_bitmap, n)) | 1259 | if (copy_from_user(dirty_bitmap_buffer, log->dirty_bitmap, n)) |
| @@ -2995,8 +3000,10 @@ static int kvm_ioctl_create_device(struct kvm *kvm, | |||
| 2995 | if (ops->init) | 3000 | if (ops->init) |
| 2996 | ops->init(dev); | 3001 | ops->init(dev); |
| 2997 | 3002 | ||
| 3003 | kvm_get_kvm(kvm); | ||
| 2998 | ret = anon_inode_getfd(ops->name, &kvm_device_fops, dev, O_RDWR | O_CLOEXEC); | 3004 | ret = anon_inode_getfd(ops->name, &kvm_device_fops, dev, O_RDWR | O_CLOEXEC); |
| 2999 | if (ret < 0) { | 3005 | if (ret < 0) { |
| 3006 | kvm_put_kvm(kvm); | ||
| 3000 | mutex_lock(&kvm->lock); | 3007 | mutex_lock(&kvm->lock); |
| 3001 | list_del(&dev->vm_node); | 3008 | list_del(&dev->vm_node); |
| 3002 | mutex_unlock(&kvm->lock); | 3009 | mutex_unlock(&kvm->lock); |
| @@ -3004,7 +3011,6 @@ static int kvm_ioctl_create_device(struct kvm *kvm, | |||
| 3004 | return ret; | 3011 | return ret; |
| 3005 | } | 3012 | } |
| 3006 | 3013 | ||
| 3007 | kvm_get_kvm(kvm); | ||
| 3008 | cd->fd = ret; | 3014 | cd->fd = ret; |
| 3009 | return 0; | 3015 | return 0; |
| 3010 | } | 3016 | } |
