media: vb2: check for sane values from queue_setup

Warn and return error from the reqbufs ioctl when driver sets 0 number
of planes or 0 as plane sizes, as these values don't make any sense.
Checking this here stops obviously wrong values from propagating
further and causing various problems that are hard to trace back to
either of these values being 0.

Signed-off-by: Johan Fjeldtvedt <johfjeld@cisco.com>
Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
Johan Fjeldtvedt 2018-09-17 04:36:47 -04:00 committed by Mauro Carvalho Chehab
parent 58513d4849
commit 8ee92410e5
1 changed files with 9 additions and 0 deletions

View File

@ -661,6 +661,7 @@ int vb2_core_reqbufs(struct vb2_queue *q, enum vb2_memory memory,
{ {
unsigned int num_buffers, allocated_buffers, num_planes = 0; unsigned int num_buffers, allocated_buffers, num_planes = 0;
unsigned plane_sizes[VB2_MAX_PLANES] = { }; unsigned plane_sizes[VB2_MAX_PLANES] = { };
unsigned int i;
int ret; int ret;
if (q->streaming) { if (q->streaming) {
@ -718,6 +719,14 @@ int vb2_core_reqbufs(struct vb2_queue *q, enum vb2_memory memory,
if (ret) if (ret)
return ret; return ret;
/* Check that driver has set sane values */
if (WARN_ON(!num_planes))
return -EINVAL;
for (i = 0; i < num_planes; i++)
if (WARN_ON(!plane_sizes[i]))
return -EINVAL;
/* Finally, allocate buffers and video memory */ /* Finally, allocate buffers and video memory */
allocated_buffers = allocated_buffers =
__vb2_queue_alloc(q, memory, num_buffers, num_planes, plane_sizes); __vb2_queue_alloc(q, memory, num_buffers, num_planes, plane_sizes);