• Wanpeng Li's avatar
    KVM: hyperv: Fix Direct Synthetic timers assert an interrupt w/o lapic_in_kernel · a073d7e3
    Wanpeng Li authored
    Reported by syzkaller:
    
    	kasan: GPF could be caused by NULL-ptr deref or user memory access
    	general protection fault: 0000 [#1] PREEMPT SMP KASAN
    	RIP: 0010:__apic_accept_irq+0x46/0x740 arch/x86/kvm/lapic.c:1029
    	Call Trace:
    	kvm_apic_set_irq+0xb4/0x140 arch/x86/kvm/lapic.c:558
    	stimer_notify_direct arch/x86/kvm/hyperv.c:648 [inline]
    	stimer_expiration arch/x86/kvm/hyperv.c:659 [inline]
    	kvm_hv_process_stimers+0x594/0x1650 arch/x86/kvm/hyperv.c:686
    	vcpu_enter_guest+0x2b2a/0x54b0 arch/x86/kvm/x86.c:7896
    	vcpu_run+0x393/0xd40 arch/x86/kvm/x86.c:8152
    	kvm_arch_vcpu_ioctl_run+0x636/0x900 arch/x86/kvm/x86.c:8360
    	kvm_vcpu_ioctl+0x6cf/0xaf0 arch/x86/kvm/../../../virt/kvm/kvm_main.c:2765
    
    The testcase programs HV_X64_MSR_STIMERn_CONFIG/HV_X64_MSR_STIMERn_COUNT,
    in addition, there is no lapic in the kernel, the counters value are small
    enough in order that kvm_hv_process_stimers() inject this already-expired
    timer interrupt into the guest through lapic in the kernel which triggers
    the NULL deferencing. This patch fixes it by don't advertise direct mode
    synthetic timers and discarding the inject when lapic is not in kernel.
    
    syzkaller source: https://syzkaller.appspot.com/x/repro.c?x=1752fe0a600000
    
    Reported-by: syzbot+dff25ee91f0c7d5c1695@syzkaller.appspotmail.com
    Cc: Paolo Bonzini <pbonzini@redhat.com>
    Cc: Radim Krčmář <rkrcmar@redhat.com>
    Signed-off-by: default avatarWanpeng Li <wanpengli@tencent.com>
    Reviewed-by: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    a073d7e3
hyperv.c 49.4 KB