OSDN Git Service

kvm: x86: svm: Fix NULL pointer dereference when AVIC not enabled
authorSuravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Fri, 21 Feb 2020 14:52:17 +0000 (08:52 -0600)
committerPaolo Bonzini <pbonzini@redhat.com>
Fri, 21 Feb 2020 17:05:20 +0000 (18:05 +0100)
commit93fd9666c269877fffb74e14f52792d9c000c1f2
tree68a7a46d160caff8e75015b48e57b2d40bb2dc01
parent624e18f92f2ec449c2b3a6d388c0dccc45e4c4d7
kvm: x86: svm: Fix NULL pointer dereference when AVIC not enabled

Launching VM w/ AVIC disabled together with pass-through device
results in NULL pointer dereference bug with the following call trace.

    RIP: 0010:svm_refresh_apicv_exec_ctrl+0x17e/0x1a0 [kvm_amd]

    Call Trace:
     kvm_vcpu_update_apicv+0x44/0x60 [kvm]
     kvm_arch_vcpu_ioctl_run+0x3f4/0x1c80 [kvm]
     kvm_vcpu_ioctl+0x3d8/0x650 [kvm]
     do_vfs_ioctl+0xaa/0x660
     ? tomoyo_file_ioctl+0x19/0x20
     ksys_ioctl+0x67/0x90
     __x64_sys_ioctl+0x1a/0x20
     do_syscall_64+0x57/0x190
     entry_SYSCALL_64_after_hwframe+0x44/0xa9

Investigation shows that this is due to the uninitialized usage of
struct vapu_svm.ir_list in the svm_set_pi_irte_mode(), which is
called from svm_refresh_apicv_exec_ctrl().

The ir_list is initialized only if AVIC is enabled. So, fixes by
adding a check if AVIC is enabled in the svm_refresh_apicv_exec_ctrl().

Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=206579
Fixes: 8937d762396d ("kvm: x86: svm: Add support to (de)activate posted interrupts.")
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Tested-by: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/svm.c