aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2017-01-24 05:56:21 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-04-21 03:31:22 -0400
commit75465e71ec3139b958d06d48dfc85720aed69b6a (patch)
treef4465bfdfe0e8bdde97efc727f8912ce7c98d569 /arch/x86
parent5a4c0738998a037f4d29dc3f25215f4e2cc98919 (diff)
kvm: fix page struct leak in handle_vmon
commit 06ce521af9558814b8606c0476c54497cf83a653 upstream. handle_vmon gets a reference on VMXON region page, but does not release it. Release the reference. Found by syzkaller; based on a patch by Dmitry. Reported-by: Dmitry Vyukov <dvyukov@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> [bwh: Backported to 3.16: use skip_emulated_instruction()] Signed-off-by: Ben Hutchings <ben@decadent.org.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'arch/x86')
-rw-r--r--arch/x86/kvm/vmx.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 69b8f8a5ecb0..43b55ef82bac 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -6925,14 +6925,20 @@ static int nested_vmx_check_vmptr(struct kvm_vcpu *vcpu, int exit_reason,
6925 } 6925 }
6926 6926
6927 page = nested_get_page(vcpu, vmptr); 6927 page = nested_get_page(vcpu, vmptr);
6928 if (page == NULL || 6928 if (page == NULL) {
6929 *(u32 *)kmap(page) != VMCS12_REVISION) {
6930 nested_vmx_failInvalid(vcpu); 6929 nested_vmx_failInvalid(vcpu);
6930 skip_emulated_instruction(vcpu);
6931 return 1;
6932 }
6933 if (*(u32 *)kmap(page) != VMCS12_REVISION) {
6931 kunmap(page); 6934 kunmap(page);
6935 nested_release_page_clean(page);
6936 nested_vmx_failInvalid(vcpu);
6932 skip_emulated_instruction(vcpu); 6937 skip_emulated_instruction(vcpu);
6933 return 1; 6938 return 1;
6934 } 6939 }
6935 kunmap(page); 6940 kunmap(page);
6941 nested_release_page_clean(page);
6936 vmx->nested.vmxon_ptr = vmptr; 6942 vmx->nested.vmxon_ptr = vmptr;
6937 break; 6943 break;
6938 case EXIT_REASON_VMCLEAR: 6944 case EXIT_REASON_VMCLEAR: