aboutsummaryrefslogtreecommitdiffstats
path: root/virt/kvm/kvm_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'virt/kvm/kvm_main.c')
-rw-r--r--virt/kvm/kvm_main.c12
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}