aboutsummaryrefslogtreecommitdiff
path: root/hw/virtio
diff options
context:
space:
mode:
authorYuri Benditovich <yuri.benditovich@daynix.com>2021-03-15 13:59:36 +0200
committerMichael S. Tsirkin <mst@redhat.com>2021-04-01 11:39:12 -0400
commitc3fd706165e9875a10606453ee2785dd51e987a5 (patch)
tree044825c44beb069274c3894eada11f80ac6721bd /hw/virtio
parent2b7d06c452014c88a13eec3a13b996aa3e9e2331 (diff)
downloadqemu-c3fd706165e9875a10606453ee2785dd51e987a5.zip
qemu-c3fd706165e9875a10606453ee2785dd51e987a5.tar.gz
qemu-c3fd706165e9875a10606453ee2785dd51e987a5.tar.bz2
virtio-pci: add check for vdev in virtio_pci_isr_read
https://bugzilla.redhat.com/show_bug.cgi?id=1743098 This commit completes the solution of segfault in hot unplug flow (by commit ccec7e9603f446fe75c6c563ba335c00cfda6a06). Added missing check for vdev in virtio_pci_isr_read. Typical stack of crash: virtio_pci_isr_read ../hw/virtio/virtio-pci.c:1365 with proxy-vdev = 0 memory_region_read_accessor at ../softmmu/memory.c:442 access_with_adjusted_size at ../softmmu/memory.c:552 memory_region_dispatch_read1 at ../softmmu/memory.c:1420 memory_region_dispatch_read at ../softmmu/memory.c:1449 flatview_read_continue at ../softmmu/physmem.c:2822 flatview_read at ../softmmu/physmem.c:2862 address_space_read_full at ../softmmu/physmem.c:2875 Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com> Message-Id: <20210315115937.14286-2-yuri.benditovich@daynix.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'hw/virtio')
-rw-r--r--hw/virtio/virtio-pci.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
index 883045a..4a3dcee 100644
--- a/hw/virtio/virtio-pci.c
+++ b/hw/virtio/virtio-pci.c
@@ -1364,9 +1364,14 @@ static uint64_t virtio_pci_isr_read(void *opaque, hwaddr addr,
{
VirtIOPCIProxy *proxy = opaque;
VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);
- uint64_t val = qatomic_xchg(&vdev->isr, 0);
- pci_irq_deassert(&proxy->pci_dev);
+ uint64_t val;
+
+ if (vdev == NULL) {
+ return 0;
+ }
+ val = qatomic_xchg(&vdev->isr, 0);
+ pci_irq_deassert(&proxy->pci_dev);
return val;
}