]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
virtio: pci: Bounds check device config access
authorAndrew Scull <ascull@google.com>
Thu, 21 Apr 2022 16:11:01 +0000 (16:11 +0000)
committerTom Rini <trini@konsulko.com>
Tue, 3 May 2022 19:50:45 +0000 (15:50 -0400)
The device config is optional, so check it was present and mapped before
trying to use the pointer. Bounds violations are an error, not just a
warning, so bail if the checks fail.

Signed-off-by: Andrew Scull <ascull@google.com>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
drivers/virtio/virtio_pci_modern.c

index 55d25cb81b95523aebc16370ad1bd91bec36dbfd..bcf9f189971643e6b28ee7c5498994e695aa671e 100644 (file)
@@ -114,7 +114,11 @@ static int virtio_pci_get_config(struct udevice *udev, unsigned int offset,
        __le16 w;
        __le32 l;
 
-       WARN_ON(offset + len > priv->device_len);
+       if (!priv->device)
+               return -ENOSYS;
+
+       if (offset + len > priv->device_len)
+               return -EINVAL;
 
        switch (len) {
        case 1:
@@ -136,7 +140,7 @@ static int virtio_pci_get_config(struct udevice *udev, unsigned int offset,
                memcpy(buf + sizeof(l), &l, sizeof(l));
                break;
        default:
-               WARN_ON(true);
+               return -EINVAL;
        }
 
        return 0;
@@ -150,7 +154,11 @@ static int virtio_pci_set_config(struct udevice *udev, unsigned int offset,
        __le16 w;
        __le32 l;
 
-       WARN_ON(offset + len > priv->device_len);
+       if (!priv->device)
+               return -ENOSYS;
+
+       if (offset + len > priv->device_len)
+               return -EINVAL;
 
        switch (len) {
        case 1:
@@ -172,7 +180,7 @@ static int virtio_pci_set_config(struct udevice *udev, unsigned int offset,
                iowrite32(le32_to_cpu(l), priv->device + offset + sizeof(l));
                break;
        default:
-               WARN_ON(true);
+               return -EINVAL;
        }
 
        return 0;