media: mediatek: vcodec: fix resource leaks in vdec_msg_queue_init()
authorDan Carpenter <dan.carpenter@linaro.org>
Wed, 14 Jun 2023 13:06:47 +0000 (16:06 +0300)
committerHans Verkuil <hverkuil-cisco@xs4all.nl>
Tue, 25 Jul 2023 08:35:00 +0000 (10:35 +0200)
If we encounter any error in the vdec_msg_queue_init() then we need
to set "msg_queue->wdma_addr.size = 0;".  Normally, this is done
inside the vdec_msg_queue_deinit() function.  However, if the
first call to allocate &msg_queue->wdma_addr fails, then the
vdec_msg_queue_deinit() function is a no-op.  For that situation, just
set the size to zero explicitly and return.

There were two other error paths which did not clean up before returning.
Change those error paths to goto mem_alloc_err.

Fixes: b199fe46f35c ("media: mtk-vcodec: Add msg queue feature for lat and core architecture")
Fixes: 2f5d0aef37c6 ("media: mediatek: vcodec: support stateless AV1 decoder")
Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org>
Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
drivers/media/platform/mediatek/vcodec/vdec_msg_queue.c

index f2d21b5bc5c3a4aae67c80672f04ec7e6a9a4e72..898f9dbb9f46d34062076563f4e418cebb6ae138 100644 (file)
@@ -308,6 +308,7 @@ int vdec_msg_queue_init(struct vdec_msg_queue *msg_queue,
        err = mtk_vcodec_mem_alloc(ctx, &msg_queue->wdma_addr);
        if (err) {
                mtk_v4l2_err("failed to allocate wdma_addr buf");
+               msg_queue->wdma_addr.size = 0;
                return -ENOMEM;
        }
        msg_queue->wdma_rptr_addr = msg_queue->wdma_addr.dma_addr;
@@ -339,14 +340,14 @@ int vdec_msg_queue_init(struct vdec_msg_queue *msg_queue,
                        err = mtk_vcodec_mem_alloc(ctx, &lat_buf->rd_mv_addr);
                        if (err) {
                                mtk_v4l2_err("failed to allocate rd_mv_addr buf[%d]", i);
-                               return -ENOMEM;
+                               goto mem_alloc_err;
                        }
 
                        lat_buf->tile_addr.size = VDEC_LAT_TILE_SZ;
                        err = mtk_vcodec_mem_alloc(ctx, &lat_buf->tile_addr);
                        if (err) {
                                mtk_v4l2_err("failed to allocate tile_addr buf[%d]", i);
-                               return -ENOMEM;
+                               goto mem_alloc_err;
                        }
                }