On Monday 31 August 2009 13:58:54 Tuukka.O Toivonen wrote:
> When user space queues a buffer using VIDIOC_QBUF, the kernel
> should set flags in struct v4l2_buffer as specified in the V4L2
> documentation.
You forgot your SoB line.
> ---
> drivers/media/video/videobuf-core.c | 7 +++++++
> 1 files changed, 7 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/media/video/videobuf-core.c
> b/drivers/media/video/videobuf-core.c index b7b0584..1322056 100644
> --- a/drivers/media/video/videobuf-core.c
> +++ b/drivers/media/video/videobuf-core.c
> @@ -477,6 +477,7 @@ int videobuf_qbuf(struct videobuf_queue *q,
> struct videobuf_buffer *buf;
> enum v4l2_field field;
> unsigned long flags = 0;
> + __u32 buffer_flags = b->flags;
Is that safe ? What if userspace sets bogus flags ? What about hardcoding the
flags to V4L2_BUF_FLAG_QUEUED (| V4L2_BUF_FLAG_MAPPED when buf->map is not
NULL) instead, like videobuf_status does ?
> int retval;
>
> MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS);
> @@ -531,6 +532,8 @@ int videobuf_qbuf(struct videobuf_queue *q,
> "but buffer addr is zero!\n");
> goto done;
> }
> + buffer_flags |= V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_QUEUED;
> + buffer_flags &= ~V4L2_BUF_FLAG_DONE;
> break;
> case V4L2_MEMORY_USERPTR:
> if (b->length < buf->bsize) {
> @@ -541,6 +544,8 @@ int videobuf_qbuf(struct videobuf_queue *q,
> buf->baddr != b->m.userptr)
> q->ops->buf_release(q, buf);
> buf->baddr = b->m.userptr;
> + buffer_flags |= V4L2_BUF_FLAG_QUEUED;
> + buffer_flags &= ~(V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_DONE);
> break;
> case V4L2_MEMORY_OVERLAY:
> buf->boff = b->m.offset;
> @@ -564,6 +569,8 @@ int videobuf_qbuf(struct videobuf_queue *q,
> q->ops->buf_queue(q, buf);
> spin_unlock_irqrestore(q->irqlock, flags);
> }
> +
> + b->flags = buffer_flags;
> dprintk(1, "qbuf: succeded\n");
> retval = 0;
> wake_up_interruptible_sync(&q->wait);
--
Laurent Pinchart
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html