diff options
author | Keir Fraser <keirf@google.com> | 2022-03-23 15:07:27 +0100 |
---|---|---|
committer | Michael S. Tsirkin <mst@redhat.com> | 2022-03-28 22:52:59 +0200 |
commit | 3f63a1d7f6f500b6891b1003cec3e23ea4996a2e (patch) | |
tree | 2615cc453c0a7999244092a05c1dfe7f8a62c095 /drivers/virtio/virtio_pci_modern_dev.c | |
parent | Revert "virtio_pci: harden MSI-X interrupts" (diff) | |
download | linux-3f63a1d7f6f500b6891b1003cec3e23ea4996a2e.tar.xz linux-3f63a1d7f6f500b6891b1003cec3e23ea4996a2e.zip |
virtio: pci: check bar values read from virtio config space
virtio pci config structures may in future have non-standard bar
values in the bar field. We should anticipate this by skipping any
structures containing such a reserved value.
The bar value should never change: check for harmful modified values
we re-read it from the config space in vp_modern_map_capability().
Also clean up an existing check to consistently use PCI_STD_NUM_BARS.
Signed-off-by: Keir Fraser <keirf@google.com>
Link: https://lore.kernel.org/r/20220323140727.3499235-1-keirf@google.com
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'drivers/virtio/virtio_pci_modern_dev.c')
-rw-r--r-- | drivers/virtio/virtio_pci_modern_dev.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/virtio/virtio_pci_modern_dev.c b/drivers/virtio/virtio_pci_modern_dev.c index e8b3ff2b9fbc..591738ad3d56 100644 --- a/drivers/virtio/virtio_pci_modern_dev.c +++ b/drivers/virtio/virtio_pci_modern_dev.c @@ -35,6 +35,13 @@ vp_modern_map_capability(struct virtio_pci_modern_device *mdev, int off, pci_read_config_dword(dev, off + offsetof(struct virtio_pci_cap, length), &length); + /* Check if the BAR may have changed since we requested the region. */ + if (bar >= PCI_STD_NUM_BARS || !(mdev->modern_bars & (1 << bar))) { + dev_err(&dev->dev, + "virtio_pci: bar unexpectedly changed to %u\n", bar); + return NULL; + } + if (length <= start) { dev_err(&dev->dev, "virtio_pci: bad capability len %u (>%u expected)\n", @@ -120,7 +127,7 @@ static inline int virtio_pci_find_capability(struct pci_dev *dev, u8 cfg_type, &bar); /* Ignore structures with reserved BAR values */ - if (bar > 0x5) + if (bar >= PCI_STD_NUM_BARS) continue; if (type == cfg_type) { |