The block driver allocates its virtqueue before checking the advertised
block size. An invalid size makes probe return -EIO without releasing
the queue, causing a memory leak.

Change to read and validate the configuration before allocating the
virtqueue instead.

Signed-off-by: Bin Meng <[email protected]>
---

 drivers/virtio/virtio_blk.c | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/drivers/virtio/virtio_blk.c b/drivers/virtio/virtio_blk.c
index 404d9140cb2..3d5d29f00df 100644
--- a/drivers/virtio/virtio_blk.c
+++ b/drivers/virtio/virtio_blk.c
@@ -251,13 +251,8 @@ static int virtio_blk_probe(struct udevice *dev)
        struct virtio_blk_priv *priv = dev_get_priv(dev);
        struct blk_desc *desc = dev_get_uclass_plat(dev);
        u64 cap;
-       int ret;
        u32 blk_size;
 
-       ret = virtio_find_vqs(dev, 1, &priv->vq);
-       if (ret)
-               return ret;
-
        virtio_cread(dev, struct virtio_blk_config, capacity, &cap);
        desc->lba = cap;
        if (virtio_has_feature(dev, VIRTIO_BLK_F_BLK_SIZE)) {
@@ -281,7 +276,7 @@ static int virtio_blk_probe(struct udevice *dev)
        else
                priv->seg_max = -1U;
 
-       return 0;
+       return virtio_find_vqs(dev, 1, &priv->vq);
 }
 
 static const struct blk_ops virtio_blk_ops = {
-- 
2.53.0

Reply via email to