• Paolo Bonzini's avatar
    KVM: avoid NULL pointer dereference in kvm_dirty_ring_push · 5593473a
    Paolo Bonzini authored
    
    
    kvm_vcpu_release() will call kvm_dirty_ring_free(), freeing
    ring->dirty_gfns and setting it to NULL.  Afterwards, it calls
    kvm_arch_vcpu_destroy().
    
    However, if closing the file descriptor races with KVM_RUN in such away
    that vcpu->arch.st.preempted == 0, the following call stack leads to a
    NULL pointer dereference in kvm_dirty_run_push():
    
     mark_page_dirty_in_slot+0x192/0x270 arch/x86/kvm/../../../virt/kvm/kvm_main.c:3171
     kvm_steal_time_set_preempted arch/x86/kvm/x86.c:4600 [inline]
     kvm_arch_vcpu_put+0x34e/0x5b0 arch/x86/kvm/x86.c:4618
     vcpu_put+0x1b/0x70 arch/x86/kvm/../../../virt/kvm/kvm_main.c:211
     vmx_free_vcpu+0xcb/0x130 arch/x86/kvm/vmx/vmx.c:6985
     kvm_arch_vcpu_destroy+0x76/0x290 arch/x86/kvm/x86.c:11219
     kvm_vcpu_destroy arch/x86/kvm/../../../virt/kvm/kvm_main.c:441 [inline]
    
    The fix is to release the dirty page ring after kvm_arch_vcpu_destroy
    has run.
    Reported-by: default avatarQiuhao Li <qiuhao@sysec.org>
    Reported-by: default avatarGaoning Pan <pgn@zju.edu.cn>
    Reported-by: default avatarYongkang Jia <kangel@zju.edu.cn>
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    5593473a
kvm_main.c 146 KB