mirror of
https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-22 00:09:11 +03:00
media: vb2: vb2_core_queue_init(): sanity check lock and wait_prepare/finish
Add two new checks: 1) wait_prepare and wait_finish callbacks are either both present or both unset, you can't mix. 2) if lock == NULL, then wait_prepare (and due to check 1 also wait_finish) must be present. These checks should prevent the case where lock == NULL, but there is no way to release/reacquire whatever lock is used when waiting for a buffer to arrive in VIDIOC_DQBUF. Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
parent
7e8ca483c0
commit
c780d01cf1
@ -2644,6 +2644,14 @@ int vb2_core_queue_init(struct vb2_queue *q)
|
||||
if (WARN_ON(q->min_reqbufs_allocation > q->max_num_buffers))
|
||||
return -EINVAL;
|
||||
|
||||
/* Either both or none are set */
|
||||
if (WARN_ON(!q->ops->wait_prepare ^ !q->ops->wait_finish))
|
||||
return -EINVAL;
|
||||
|
||||
/* Warn if q->lock is NULL and no custom wait_prepare is provided */
|
||||
if (WARN_ON(!q->lock && !q->ops->wait_prepare))
|
||||
return -EINVAL;
|
||||
|
||||
INIT_LIST_HEAD(&q->queued_list);
|
||||
INIT_LIST_HEAD(&q->done_list);
|
||||
spin_lock_init(&q->done_lock);
|
||||
|
Loading…
Reference in New Issue
Block a user