Hi all,

I'm extending v4l2-compliance with support for VIDIOC_REQBUFS and 
VIDIOC_CREATE_BUFS,
and I ran into an undefined issue: what happens if VIDIOC_CREATE_BUFS is called 
with
count set to 0?

I think there should be a separate test for that. Right now queue_setup will 
receive
a request for 0 buffers, and I don't know if drivers expect a zero value there.

I suggest that CREATE_BUFS with a count of 0 will only check whether memory and
format.type are valid, and if they are it will just return 0 and do nothing.

Also note that this code in vb2_create_bufs is wrong:

        ret = __vb2_queue_alloc(q, create->memory, num_buffers,
                                num_planes);
        if (ret < 0) {
                dprintk(1, "Memory allocation failed with error: %d\n", ret);
                return ret;
        }

It should be:

                if (ret == 0) {

__vb2_queue_alloc() returns the number of buffers it managed to allocate,
which is never < 0.

I propose to add the patch included below.

Comments are welcome!

Regards,

        Hans

diff --git a/drivers/media/video/videobuf2-core.c 
b/drivers/media/video/videobuf2-core.c
index a0702fd..01a8312 100644
--- a/drivers/media/video/videobuf2-core.c
+++ b/drivers/media/video/videobuf2-core.c
@@ -647,6 +647,9 @@ int vb2_create_bufs(struct vb2_queue *q, struct 
v4l2_create_buffers *create)
                return -EINVAL;
        }
 
+       if (create->count == 0)
+               return 0;
+
        if (q->num_buffers == VIDEO_MAX_FRAME) {
                dprintk(1, "%s(): maximum number of buffers already 
allocated\n",
                        __func__);
@@ -675,7 +678,7 @@ int vb2_create_bufs(struct vb2_queue *q, struct 
v4l2_create_buffers *create)
        /* Finally, allocate buffers and video memory */
        ret = __vb2_queue_alloc(q, create->memory, num_buffers,
                                num_planes);
-       if (ret < 0) {
+       if (ret == 0) {
                dprintk(1, "Memory allocation failed with error: %d\n", ret);
                return ret;
        }
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to