Skip to content

Commit 987d114

Browse files
ebiggersbonzini
authored andcommitted
KVM: fix unregistering coalesced mmio zone from wrong bus
If you register a kvm_coalesced_mmio_zone with '.pio = 0' but then unregister it with '.pio = 1', KVM_UNREGISTER_COALESCED_MMIO will try to unregister it from KVM_PIO_BUS rather than KVM_MMIO_BUS, which is a no-op. But it frees the kvm_coalesced_mmio_dev anyway, causing a use-after-free. Fix it by only unregistering and freeing the zone if the correct value of 'pio' is provided. Reported-by: syzbot+f87f60bb6f13f39b54e3@syzkaller.appspotmail.com Fixes: 0804c84 ("kvm/x86 : add coalesced pio support") Signed-off-by: Eric Biggers <ebiggers@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
1 parent 7566ec3 commit 987d114

File tree

1 file changed

+5
-1
lines changed

1 file changed

+5
-1
lines changed

virt/kvm/coalesced_mmio.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,10 +175,14 @@ int kvm_vm_ioctl_unregister_coalesced_mmio(struct kvm *kvm,
175175
{
176176
struct kvm_coalesced_mmio_dev *dev, *tmp;
177177

178+
if (zone->pio != 1 && zone->pio != 0)
179+
return -EINVAL;
180+
178181
mutex_lock(&kvm->slots_lock);
179182

180183
list_for_each_entry_safe(dev, tmp, &kvm->coalesced_zones, list)
181-
if (coalesced_mmio_in_range(dev, zone->addr, zone->size)) {
184+
if (zone->pio == dev->zone.pio &&
185+
coalesced_mmio_in_range(dev, zone->addr, zone->size)) {
182186
kvm_io_bus_unregister_dev(kvm,
183187
zone->pio ? KVM_PIO_BUS : KVM_MMIO_BUS, &dev->dev);
184188
kvm_iodevice_destructor(&dev->dev);

0 commit comments

Comments
 (0)