diff options
Diffstat (limited to 'virt/kvm/kvm_main.c')
| -rw-r--r-- | virt/kvm/kvm_main.c | 9 | 
1 files changed, 7 insertions, 2 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 1f888a103f78..5ecea812cb6a 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,  {  	struct kvm_memslots *slots;  	struct kvm_memory_slot *memslot; -	int as_id, id, n; +	int as_id, id;  	gfn_t offset; -	unsigned long i; +	unsigned long i, n;  	unsigned long *dirty_bitmap;  	unsigned long *dirty_bitmap_buffer; @@ -1249,6 +1249,11 @@ int kvm_clear_dirty_log_protect(struct kvm *kvm,  		return -ENOENT;  	n = kvm_dirty_bitmap_bytes(memslot); + +	if (log->first_page > memslot->npages || +	    log->num_pages > memslot->npages - log->first_page) +			return -EINVAL; +  	*flush = false;  	dirty_bitmap_buffer = kvm_second_dirty_bitmap(memslot);  	if (copy_from_user(dirty_bitmap_buffer, log->dirty_bitmap, n))  | 
