]> git.baikalelectronics.ru Git - kernel.git/commit
KVM: Disallow user memslot with size that exceeds "unsigned long"
authorSean Christopherson <seanjc@google.com>
Thu, 4 Nov 2021 00:25:03 +0000 (00:25 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 8 Dec 2021 08:04:43 +0000 (09:04 +0100)
commit394337fb932195c49308f06b134d6ea26287c0e2
tree2dc92b9a70c3a0b58cbdbf0c05271244bb0ef65c
parent3913f9c9a5f9bc886a140a96133a0b26cad607dc
KVM: Disallow user memslot with size that exceeds "unsigned long"

commit 25f43fba6ef18290ee7cf3a5d6285506d2ea7a8a upstream.

Reject userspace memslots whose size exceeds the storage capacity of an
"unsigned long".  KVM's uAPI takes the size as u64 to support large slots
on 64-bit hosts, but does not account for the size being truncated on
32-bit hosts in various flows.  The access_ok() check on the userspace
virtual address in particular casts the size to "unsigned long" and will
check the wrong number of bytes.

KVM doesn't actually support slots whose size doesn't fit in an "unsigned
long", e.g. KVM's internal kvm_memory_slot.npages is an "unsigned long",
not a "u64", and misc arch specific code follows that behavior.

Fixes: 4b7df28d24ad ("KVM: Validate userspace_addr of memslot when registered")
Cc: stable@vger.kernel.org
Signed-off-by: Sean Christopherson <seanjc@google.com>
Reviewed-by: Maciej S. Szmigiero <maciej.szmigiero@oracle.com>
Message-Id: <20211104002531.1176691-3-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
virt/kvm/kvm_main.c