mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-22 02:17:36 -04:00
media: airspy: 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. airspy_start_streaming() returned -ENODEV early when the USB device had been disconnected (s->udev == NULL) without returning any buffers that buf_queue() had already accepted. Take v4l2_lock first and jump to the existing err_clear_bit label, which already drains s->queued_bufs via vb2_buffer_done(..., VB2_BUF_STATE_QUEUED) before unlocking. This mirrors the uvcvideo fix in commit4cf3b6fd54("media: uvcvideo: Return queued buffers on start_streaming() failure"). Fixes:634fe50339("[media] airspy: AirSpy SDR 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:
committed by
Hans Verkuil
parent
5fec5c8f11
commit
04344d0b49
@@ -522,11 +522,13 @@ static int airspy_start_streaming(struct vb2_queue *vq, unsigned int count)
|
||||
|
||||
dev_dbg(s->dev, "\n");
|
||||
|
||||
if (!s->udev)
|
||||
return -ENODEV;
|
||||
|
||||
mutex_lock(&s->v4l2_lock);
|
||||
|
||||
if (!s->udev) {
|
||||
ret = -ENODEV;
|
||||
goto err_clear_bit;
|
||||
}
|
||||
|
||||
s->sequence = 0;
|
||||
|
||||
set_bit(POWER_ON, &s->flags);
|
||||
|
||||
Reference in New Issue
Block a user