media: uvcvideo: Fix .queue_setup() to check the number of planes
authorGuennadi Liakhovetski <g.liakhovetski@gmx.de>
Tue, 8 Aug 2017 12:56:22 +0000 (08:56 -0400)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Sun, 20 Aug 2017 12:09:00 +0000 (08:09 -0400)
According to documentation of struct vb2_ops the .queue_setup() callback
should return an error if the number of planes parameter contains an
invalid value on input. Fix this instead of ignoring the value.

Signed-off-by: Guennadi Liakhovetski <guennadi.liakhovetski@intel.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
drivers/media/usb/uvc/uvc_queue.c

index aa2199775cb8f37061c021ae0ed3198bfc199f43..c8d78b2f3de450763b634daba50514571bb72715 100644 (file)
@@ -82,9 +82,14 @@ static int uvc_queue_setup(struct vb2_queue *vq,
        struct uvc_streaming *stream = uvc_queue_to_stream(queue);
        unsigned size = stream->ctrl.dwMaxVideoFrameSize;
 
-       /* Make sure the image size is large enough. */
+       /*
+        * When called with plane sizes, validate them. The driver supports
+        * single planar formats only, and requires buffers to be large enough
+        * to store a complete frame.
+        */
        if (*nplanes)
-               return sizes[0] < size ? -EINVAL : 0;
+               return *nplanes != 1 || sizes[0] < size ? -EINVAL : 0;
+
        *nplanes = 1;
        sizes[0] = size;
        return 0;