mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 21:21:41 +00:00
KVM: Validate hva in kvm_gpc_activate_hva() to fix __kvm_gpc_refresh() WARN
Check that the virtual address is "ok" when activating a gfn_to_pfn_cache with a host VA to ensure that KVM never attempts to use a bad address. This fixes a bug where KVM fails to check the incoming address when handling KVM_XEN_VCPU_ATTR_TYPE_VCPU_INFO_HVA in kvm_xen_vcpu_set_attr(). Reported-by: syzbot+fd555292a1da3180fc82@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=fd555292a1da3180fc82 Tested-by: syzbot+fd555292a1da3180fc82@syzkaller.appspotmail.com Signed-off-by: Pei Li <peili.dev@gmail.com> Reviewed-by: Paul Durrant <paul@xen.org> Reviewed-by: David Woodhouse <dwmw@amazon.co.uk> Link: https://lore.kernel.org/r/20240627-bug5-v2-1-2c63f7ee6739@gmail.com [sean: rewrite changelog with --verbose] Signed-off-by: Sean Christopherson <seanjc@google.com>
This commit is contained in:
parent
dee67a94d4
commit
ebbdf37ce9
@ -741,7 +741,7 @@ int kvm_xen_hvm_set_attr(struct kvm *kvm, struct kvm_xen_hvm_attr *data)
|
|||||||
} else {
|
} else {
|
||||||
void __user * hva = u64_to_user_ptr(data->u.shared_info.hva);
|
void __user * hva = u64_to_user_ptr(data->u.shared_info.hva);
|
||||||
|
|
||||||
if (!PAGE_ALIGNED(hva) || !access_ok(hva, PAGE_SIZE)) {
|
if (!PAGE_ALIGNED(hva)) {
|
||||||
r = -EINVAL;
|
r = -EINVAL;
|
||||||
} else if (!hva) {
|
} else if (!hva) {
|
||||||
kvm_gpc_deactivate(&kvm->arch.xen.shinfo_cache);
|
kvm_gpc_deactivate(&kvm->arch.xen.shinfo_cache);
|
||||||
|
@ -430,6 +430,9 @@ int kvm_gpc_activate(struct gfn_to_pfn_cache *gpc, gpa_t gpa, unsigned long len)
|
|||||||
|
|
||||||
int kvm_gpc_activate_hva(struct gfn_to_pfn_cache *gpc, unsigned long uhva, unsigned long len)
|
int kvm_gpc_activate_hva(struct gfn_to_pfn_cache *gpc, unsigned long uhva, unsigned long len)
|
||||||
{
|
{
|
||||||
|
if (!access_ok((void __user *)uhva, len))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
return __kvm_gpc_activate(gpc, INVALID_GPA, uhva, len);
|
return __kvm_gpc_activate(gpc, INVALID_GPA, uhva, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user