mirror of
https://github.com/torvalds/linux.git
synced 2026-07-29 10:41:49 +02:00
media: sun4i-csi: Return queued buffers on start_streaming() failure
The vb2 framework hands buffers to the driver via buf_queue() before calling start_streaming(). If start_streaming() returns an error without first returning those buffers via vb2_buffer_done(), vb2_start_streaming() fires WARN_ON(owned_by_drv_count) and the queued buffers leak. sun4i_csi_start_streaming() returned -EINVAL when no matching CSI format could be found, before any setup (scratch buffer allocation, pipeline start) had been performed. The remaining error paths already converge on the err_clear_dma_queue label, which calls return_all_buffers(..., VB2_BUF_STATE_QUEUED) under csi->qlock. Jump to that label directly: the intermediate err_disable_device / err_disable_pipeline / err_free_scratch_buffer labels are skipped, which is correct because nothing they would undo has happened yet. This mirrors the uvcvideo fix in commit4cf3b6fd54("media: uvcvideo: Return queued buffers on start_streaming() failure"). Fixes:577bbf23b7("media: sunxi: Add A10 CSI driver") Cc: stable@vger.kernel.org Signed-off-by: Valery Borovsky <vebohr@gmail.com> Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
This commit is contained in:
parent
ffc8eec063
commit
bbba3e260a
|
|
@ -234,8 +234,10 @@ static int sun4i_csi_start_streaming(struct vb2_queue *vq, unsigned int count)
|
|||
int ret;
|
||||
|
||||
csi_fmt = sun4i_csi_find_format(&csi->fmt.pixelformat, NULL);
|
||||
if (!csi_fmt)
|
||||
return -EINVAL;
|
||||
if (!csi_fmt) {
|
||||
ret = -EINVAL;
|
||||
goto err_clear_dma_queue;
|
||||
}
|
||||
|
||||
dev_dbg(csi->dev, "Starting capture\n");
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user