aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/v4l2-core/v4l2-ioctl.c
diff options
context:
space:
mode:
authorSakari Ailus <sakari.ailus@linux.intel.com>2019-01-10 07:43:19 -0500
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>2019-01-16 11:12:10 -0500
commit9048b2e15b11c591c649cc6edc7a64fa62c15419 (patch)
treeb2db22dae3e4800d48dffe3303ae09e97c7ac70b /drivers/media/v4l2-core/v4l2-ioctl.c
parentdd91642ac71208fe972a9c577ed52b6b3ba7b732 (diff)
media: v4l: ioctl: Validate num_planes before using it
The for loop to reset the memory of the plane reserved fields runs over num_planes provided by the user without validating it. Ensure num_planes is no more than VIDEO_MAX_PLANES before the loop. Fixes: 4e1e0eb0e074 ("media: v4l2-ioctl: Zero v4l2_plane_pix_format reserved fields") Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Reviewed-by: Thierry Reding <treding@nvidia.com> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-ioctl.c')
-rw-r--r--drivers/media/v4l2-core/v4l2-ioctl.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c
index ca85c3a9a7b9..44bc7c4f1c11 100644
--- a/drivers/media/v4l2-core/v4l2-ioctl.c
+++ b/drivers/media/v4l2-core/v4l2-ioctl.c
@@ -1551,6 +1551,8 @@ static int v4l_s_fmt(const struct v4l2_ioctl_ops *ops,
1551 if (unlikely(!ops->vidioc_s_fmt_vid_cap_mplane)) 1551 if (unlikely(!ops->vidioc_s_fmt_vid_cap_mplane))
1552 break; 1552 break;
1553 CLEAR_AFTER_FIELD(p, fmt.pix_mp.xfer_func); 1553 CLEAR_AFTER_FIELD(p, fmt.pix_mp.xfer_func);
1554 if (p->fmt.pix_mp.num_planes > VIDEO_MAX_PLANES)
1555 break;
1554 for (i = 0; i < p->fmt.pix_mp.num_planes; i++) 1556 for (i = 0; i < p->fmt.pix_mp.num_planes; i++)
1555 CLEAR_AFTER_FIELD(&p->fmt.pix_mp.plane_fmt[i], 1557 CLEAR_AFTER_FIELD(&p->fmt.pix_mp.plane_fmt[i],
1556 bytesperline); 1558 bytesperline);
@@ -1582,6 +1584,8 @@ static int v4l_s_fmt(const struct v4l2_ioctl_ops *ops,
1582 if (unlikely(!ops->vidioc_s_fmt_vid_out_mplane)) 1584 if (unlikely(!ops->vidioc_s_fmt_vid_out_mplane))
1583 break; 1585 break;
1584 CLEAR_AFTER_FIELD(p, fmt.pix_mp.xfer_func); 1586 CLEAR_AFTER_FIELD(p, fmt.pix_mp.xfer_func);
1587 if (p->fmt.pix_mp.num_planes > VIDEO_MAX_PLANES)
1588 break;
1585 for (i = 0; i < p->fmt.pix_mp.num_planes; i++) 1589 for (i = 0; i < p->fmt.pix_mp.num_planes; i++)
1586 CLEAR_AFTER_FIELD(&p->fmt.pix_mp.plane_fmt[i], 1590 CLEAR_AFTER_FIELD(&p->fmt.pix_mp.plane_fmt[i],
1587 bytesperline); 1591 bytesperline);
@@ -1650,6 +1654,8 @@ static int v4l_try_fmt(const struct v4l2_ioctl_ops *ops,
1650 if (unlikely(!ops->vidioc_try_fmt_vid_cap_mplane)) 1654 if (unlikely(!ops->vidioc_try_fmt_vid_cap_mplane))
1651 break; 1655 break;
1652 CLEAR_AFTER_FIELD(p, fmt.pix_mp.xfer_func); 1656 CLEAR_AFTER_FIELD(p, fmt.pix_mp.xfer_func);
1657 if (p->fmt.pix_mp.num_planes > VIDEO_MAX_PLANES)
1658 break;
1653 for (i = 0; i < p->fmt.pix_mp.num_planes; i++) 1659 for (i = 0; i < p->fmt.pix_mp.num_planes; i++)
1654 CLEAR_AFTER_FIELD(&p->fmt.pix_mp.plane_fmt[i], 1660 CLEAR_AFTER_FIELD(&p->fmt.pix_mp.plane_fmt[i],
1655 bytesperline); 1661 bytesperline);
@@ -1681,6 +1687,8 @@ static int v4l_try_fmt(const struct v4l2_ioctl_ops *ops,
1681 if (unlikely(!ops->vidioc_try_fmt_vid_out_mplane)) 1687 if (unlikely(!ops->vidioc_try_fmt_vid_out_mplane))
1682 break; 1688 break;
1683 CLEAR_AFTER_FIELD(p, fmt.pix_mp.xfer_func); 1689 CLEAR_AFTER_FIELD(p, fmt.pix_mp.xfer_func);
1690 if (p->fmt.pix_mp.num_planes > VIDEO_MAX_PLANES)
1691 break;
1684 for (i = 0; i < p->fmt.pix_mp.num_planes; i++) 1692 for (i = 0; i < p->fmt.pix_mp.num_planes; i++)
1685 CLEAR_AFTER_FIELD(&p->fmt.pix_mp.plane_fmt[i], 1693 CLEAR_AFTER_FIELD(&p->fmt.pix_mp.plane_fmt[i],
1686 bytesperline); 1694 bytesperline);