mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
KVM: fix KVM_CLEAR_DIRTY_LOG for memory slots of unaligned size
If a memory slot's size is not a multiple of 64 pages (256K), then
the KVM_CLEAR_DIRTY_LOG API is unusable: clearing the final 64 pages
either requires the requested page range to go beyond memslot->npages,
or requires log->num_pages to be unaligned, and kvm_clear_dirty_log_protect
requires log->num_pages to be both in range and aligned.
To allow this case, allow log->num_pages not to be a multiple of 64 if
it ends exactly on the last page of the slot.
Reported-by: Peter Xu <[email protected]>
Fixes: 98938aa8ed ("KVM: validate userspace input in kvm_clear_dirty_log_protect()", 2019-01-02)
Signed-off-by: Paolo Bonzini <[email protected]>
This commit is contained in:
parent
0967fa1cd3
commit
65c4189de8
3 changed files with 9 additions and 7 deletions
|
|
@ -1240,7 +1240,7 @@ int kvm_clear_dirty_log_protect(struct kvm *kvm,
|
|||
if (as_id >= KVM_ADDRESS_SPACE_NUM || id >= KVM_USER_MEM_SLOTS)
|
||||
return -EINVAL;
|
||||
|
||||
if ((log->first_page & 63) || (log->num_pages & 63))
|
||||
if (log->first_page & 63)
|
||||
return -EINVAL;
|
||||
|
||||
slots = __kvm_memslots(kvm, as_id);
|
||||
|
|
@ -1253,8 +1253,9 @@ int kvm_clear_dirty_log_protect(struct kvm *kvm,
|
|||
n = kvm_dirty_bitmap_bytes(memslot);
|
||||
|
||||
if (log->first_page > memslot->npages ||
|
||||
log->num_pages > memslot->npages - log->first_page)
|
||||
return -EINVAL;
|
||||
log->num_pages > memslot->npages - log->first_page ||
|
||||
(log->num_pages < memslot->npages - log->first_page && (log->num_pages & 63)))
|
||||
return -EINVAL;
|
||||
|
||||
*flush = false;
|
||||
dirty_bitmap_buffer = kvm_second_dirty_bitmap(memslot);
|
||||
|
|
|
|||
Loading…
Reference in a new issue