From: Paolo Bonzini <pbonzini@xxxxxxxxxx> commit 5593473a1e6c743764b08e3b6071cb43b5cfa6c4 upstream. 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: Qiuhao Li <qiuhao@xxxxxxxxx> Reported-by: Gaoning Pan <pgn@xxxxxxxxxx> Reported-by: Yongkang Jia <kangel@xxxxxxxxxx> Cc: stable@xxxxxxxxxxxxxxx Signed-off-by: Paolo Bonzini <pbonzini@xxxxxxxxxx> Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> --- virt/kvm/kvm_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -439,8 +439,8 @@ static void kvm_vcpu_init(struct kvm_vcp static void kvm_vcpu_destroy(struct kvm_vcpu *vcpu) { - kvm_dirty_ring_free(&vcpu->dirty_ring); kvm_arch_vcpu_destroy(vcpu); + kvm_dirty_ring_free(&vcpu->dirty_ring); /* * No need for rcu_read_lock as VCPU_RUN is the only place that changes Patches currently in stable-queue which might be from pbonzini@xxxxxxxxxx are queue-5.17/mmmremap.c-avoid-pointless-invalidate_range_start-end-on-mremap-old_size-0.patch queue-5.17/kvm-x86-pmu-use-different-raw-event-masks-for-amd-an.patch queue-5.17/kvm-x86-pmu-fix-and-isolate-tsx-specific-performance.patch queue-5.17/kvm-x86-emulator-emulate-rdpid-only-if-it-is-enabled.patch queue-5.17/kvm-svm-fix-kvm_cache_regs.h-inclusions-for-is_guest.patch queue-5.17/kvm-avoid-null-pointer-dereference-in-kvm_dirty_ring_push.patch queue-5.17/kvm-x86-svm-clear-reserved-bits-written-to-perfevtse.patch