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
