Skip to content

Commit c02d138

Browse files
rkrcmargregkh
authored andcommitted
KVM: x86: fix out-of-bounds accesses of rtc_eoi map
commit 81cdb25 upstream. KVM was using arrays of size KVM_MAX_VCPUS with vcpu_id, but ID can be bigger that the maximal number of VCPUs, resulting in out-of-bounds access. Found by syzkaller: BUG: KASAN: slab-out-of-bounds in __apic_accept_irq+0xb33/0xb50 at addr [...] Write of size 1 by task a.out/27101 CPU: 1 PID: 27101 Comm: a.out Not tainted 4.9.0-rc5+ #49 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011 [...] Call Trace: [...] __apic_accept_irq+0xb33/0xb50 arch/x86/kvm/lapic.c:905 [...] kvm_apic_set_irq+0x10e/0x180 arch/x86/kvm/lapic.c:495 [...] kvm_irq_delivery_to_apic+0x732/0xc10 arch/x86/kvm/irq_comm.c:86 [...] ioapic_service+0x41d/0x760 arch/x86/kvm/ioapic.c:360 [...] ioapic_set_irq+0x275/0x6c0 arch/x86/kvm/ioapic.c:222 [...] kvm_ioapic_inject_all arch/x86/kvm/ioapic.c:235 [...] kvm_set_ioapic+0x223/0x310 arch/x86/kvm/ioapic.c:670 [...] kvm_vm_ioctl_set_irqchip arch/x86/kvm/x86.c:3668 [...] kvm_arch_vm_ioctl+0x1a08/0x23c0 arch/x86/kvm/x86.c:3999 [...] kvm_vm_ioctl+0x1fa/0x1a70 arch/x86/kvm/../../../virt/kvm/kvm_main.c:3099 Reported-by: Dmitry Vyukov <[email protected]> Fixes: af1bae5 ("KVM: x86: bump KVM_MAX_VCPU_ID to 1023") Reviewed-by: Paolo Bonzini <[email protected]> Reviewed-by: David Hildenbrand <[email protected]> Signed-off-by: Radim Krčmář <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 39b6530 commit c02d138

File tree

2 files changed

+3
-3
lines changed

2 files changed

+3
-3
lines changed

arch/x86/kvm/ioapic.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ static unsigned long ioapic_read_indirect(struct kvm_ioapic *ioapic,
9494
static void rtc_irq_eoi_tracking_reset(struct kvm_ioapic *ioapic)
9595
{
9696
ioapic->rtc_status.pending_eoi = 0;
97-
bitmap_zero(ioapic->rtc_status.dest_map.map, KVM_MAX_VCPUS);
97+
bitmap_zero(ioapic->rtc_status.dest_map.map, KVM_MAX_VCPU_ID);
9898
}
9999

100100
static void kvm_rtc_eoi_tracking_restore_all(struct kvm_ioapic *ioapic);

arch/x86/kvm/ioapic.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,13 @@ struct kvm_vcpu;
4242

4343
struct dest_map {
4444
/* vcpu bitmap where IRQ has been sent */
45-
DECLARE_BITMAP(map, KVM_MAX_VCPUS);
45+
DECLARE_BITMAP(map, KVM_MAX_VCPU_ID);
4646

4747
/*
4848
* Vector sent to a given vcpu, only valid when
4949
* the vcpu's bit in map is set
5050
*/
51-
u8 vectors[KVM_MAX_VCPUS];
51+
u8 vectors[KVM_MAX_VCPU_ID];
5252
};
5353

5454

0 commit comments

Comments
 (0)