mirror of
https://github.com/tbsdtv/media_build.git
synced 2025-07-23 04:13:02 +02:00
263 lines
9.7 KiB
Diff
263 lines
9.7 KiB
Diff
diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c
|
|
index a858acea6547..431e9d8784ab 100644
|
|
--- a/drivers/media/v4l2-core/v4l2-ioctl.c
|
|
+++ b/drivers/media/v4l2-core/v4l2-ioctl.c
|
|
@@ -32,6 +32,12 @@
|
|
|
|
#include <trace/events/v4l2.h>
|
|
|
|
+/* Zero out the end of the struct pointed to by p. Everything after, but
|
|
+ * not including, the specified field is cleared. */
|
|
+#define CLEAR_AFTER_FIELD(p, field) \
|
|
+ memset((u8 *)(p) + offsetof(typeof(*(p)), field) + sizeof((p)->field), \
|
|
+ 0, sizeof(*(p)) - offsetof(typeof(*(p)), field) - sizeof((p)->field))
|
|
+
|
|
#define is_valid_ioctl(vfd, cmd) test_bit(_IOC_NR(cmd), (vfd)->valid_ioctls)
|
|
|
|
struct std_descr {
|
|
@@ -1539,7 +1545,7 @@ static int v4l_enum_fmt(const struct v4l2_ioctl_ops *ops,
|
|
p->mbus_code = 0;
|
|
|
|
mbus_code = p->mbus_code;
|
|
- memset_after(p, 0, type);
|
|
+ CLEAR_AFTER_FIELD(p, type);
|
|
p->mbus_code = mbus_code;
|
|
|
|
switch (p->type) {
|
|
@@ -1692,7 +1698,7 @@ static int v4l_s_fmt(const struct v4l2_ioctl_ops *ops,
|
|
case V4L2_BUF_TYPE_VIDEO_CAPTURE:
|
|
if (unlikely(!ops->vidioc_s_fmt_vid_cap))
|
|
break;
|
|
- memset_after(p, 0, fmt.pix);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.pix);
|
|
ret = ops->vidioc_s_fmt_vid_cap(file, fh, arg);
|
|
/* just in case the driver zeroed it again */
|
|
p->fmt.pix.priv = V4L2_PIX_FMT_PRIV_MAGIC;
|
|
@@ -1702,15 +1708,15 @@ static int v4l_s_fmt(const struct v4l2_ioctl_ops *ops,
|
|
case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
|
|
if (unlikely(!ops->vidioc_s_fmt_vid_cap_mplane))
|
|
break;
|
|
- memset_after(p, 0, fmt.pix_mp.xfer_func);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.pix_mp.xfer_func);
|
|
for (i = 0; i < p->fmt.pix_mp.num_planes; i++)
|
|
- memset_after(&p->fmt.pix_mp.plane_fmt[i],
|
|
- 0, bytesperline);
|
|
+ CLEAR_AFTER_FIELD(&p->fmt.pix_mp.plane_fmt[i],
|
|
+ bytesperline);
|
|
return ops->vidioc_s_fmt_vid_cap_mplane(file, fh, arg);
|
|
case V4L2_BUF_TYPE_VIDEO_OVERLAY:
|
|
if (unlikely(!ops->vidioc_s_fmt_vid_overlay))
|
|
break;
|
|
- memset_after(p, 0, fmt.win);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.win);
|
|
p->fmt.win.clips = NULL;
|
|
p->fmt.win.clipcount = 0;
|
|
p->fmt.win.bitmap = NULL;
|
|
@@ -1718,17 +1724,17 @@ static int v4l_s_fmt(const struct v4l2_ioctl_ops *ops,
|
|
case V4L2_BUF_TYPE_VBI_CAPTURE:
|
|
if (unlikely(!ops->vidioc_s_fmt_vbi_cap))
|
|
break;
|
|
- memset_after(p, 0, fmt.vbi.flags);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.vbi.flags);
|
|
return ops->vidioc_s_fmt_vbi_cap(file, fh, arg);
|
|
case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
|
|
if (unlikely(!ops->vidioc_s_fmt_sliced_vbi_cap))
|
|
break;
|
|
- memset_after(p, 0, fmt.sliced.io_size);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.sliced.io_size);
|
|
return ops->vidioc_s_fmt_sliced_vbi_cap(file, fh, arg);
|
|
case V4L2_BUF_TYPE_VIDEO_OUTPUT:
|
|
if (unlikely(!ops->vidioc_s_fmt_vid_out))
|
|
break;
|
|
- memset_after(p, 0, fmt.pix);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.pix);
|
|
ret = ops->vidioc_s_fmt_vid_out(file, fh, arg);
|
|
/* just in case the driver zeroed it again */
|
|
p->fmt.pix.priv = V4L2_PIX_FMT_PRIV_MAGIC;
|
|
@@ -1736,15 +1742,15 @@ static int v4l_s_fmt(const struct v4l2_ioctl_ops *ops,
|
|
case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
|
|
if (unlikely(!ops->vidioc_s_fmt_vid_out_mplane))
|
|
break;
|
|
- memset_after(p, 0, fmt.pix_mp.xfer_func);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.pix_mp.xfer_func);
|
|
for (i = 0; i < p->fmt.pix_mp.num_planes; i++)
|
|
- memset_after(&p->fmt.pix_mp.plane_fmt[i],
|
|
- 0, bytesperline);
|
|
+ CLEAR_AFTER_FIELD(&p->fmt.pix_mp.plane_fmt[i],
|
|
+ bytesperline);
|
|
return ops->vidioc_s_fmt_vid_out_mplane(file, fh, arg);
|
|
case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
|
|
if (unlikely(!ops->vidioc_s_fmt_vid_out_overlay))
|
|
break;
|
|
- memset_after(p, 0, fmt.win);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.win);
|
|
p->fmt.win.clips = NULL;
|
|
p->fmt.win.clipcount = 0;
|
|
p->fmt.win.bitmap = NULL;
|
|
@@ -1752,32 +1758,32 @@ static int v4l_s_fmt(const struct v4l2_ioctl_ops *ops,
|
|
case V4L2_BUF_TYPE_VBI_OUTPUT:
|
|
if (unlikely(!ops->vidioc_s_fmt_vbi_out))
|
|
break;
|
|
- memset_after(p, 0, fmt.vbi.flags);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.vbi.flags);
|
|
return ops->vidioc_s_fmt_vbi_out(file, fh, arg);
|
|
case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
|
|
if (unlikely(!ops->vidioc_s_fmt_sliced_vbi_out))
|
|
break;
|
|
- memset_after(p, 0, fmt.sliced.io_size);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.sliced.io_size);
|
|
return ops->vidioc_s_fmt_sliced_vbi_out(file, fh, arg);
|
|
case V4L2_BUF_TYPE_SDR_CAPTURE:
|
|
if (unlikely(!ops->vidioc_s_fmt_sdr_cap))
|
|
break;
|
|
- memset_after(p, 0, fmt.sdr.buffersize);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.sdr.buffersize);
|
|
return ops->vidioc_s_fmt_sdr_cap(file, fh, arg);
|
|
case V4L2_BUF_TYPE_SDR_OUTPUT:
|
|
if (unlikely(!ops->vidioc_s_fmt_sdr_out))
|
|
break;
|
|
- memset_after(p, 0, fmt.sdr.buffersize);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.sdr.buffersize);
|
|
return ops->vidioc_s_fmt_sdr_out(file, fh, arg);
|
|
case V4L2_BUF_TYPE_META_CAPTURE:
|
|
if (unlikely(!ops->vidioc_s_fmt_meta_cap))
|
|
break;
|
|
- memset_after(p, 0, fmt.meta);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.meta);
|
|
return ops->vidioc_s_fmt_meta_cap(file, fh, arg);
|
|
case V4L2_BUF_TYPE_META_OUTPUT:
|
|
if (unlikely(!ops->vidioc_s_fmt_meta_out))
|
|
break;
|
|
- memset_after(p, 0, fmt.meta);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.meta);
|
|
return ops->vidioc_s_fmt_meta_out(file, fh, arg);
|
|
}
|
|
return -EINVAL;
|
|
@@ -1800,7 +1806,7 @@ static int v4l_try_fmt(const struct v4l2_ioctl_ops *ops,
|
|
case V4L2_BUF_TYPE_VIDEO_CAPTURE:
|
|
if (unlikely(!ops->vidioc_try_fmt_vid_cap))
|
|
break;
|
|
- memset_after(p, 0, fmt.pix);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.pix);
|
|
ret = ops->vidioc_try_fmt_vid_cap(file, fh, arg);
|
|
/* just in case the driver zeroed it again */
|
|
p->fmt.pix.priv = V4L2_PIX_FMT_PRIV_MAGIC;
|
|
@@ -1810,15 +1816,15 @@ static int v4l_try_fmt(const struct v4l2_ioctl_ops *ops,
|
|
case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
|
|
if (unlikely(!ops->vidioc_try_fmt_vid_cap_mplane))
|
|
break;
|
|
- memset_after(p, 0, fmt.pix_mp.xfer_func);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.pix_mp.xfer_func);
|
|
for (i = 0; i < p->fmt.pix_mp.num_planes; i++)
|
|
- memset_after(&p->fmt.pix_mp.plane_fmt[i],
|
|
- 0, bytesperline);
|
|
+ CLEAR_AFTER_FIELD(&p->fmt.pix_mp.plane_fmt[i],
|
|
+ bytesperline);
|
|
return ops->vidioc_try_fmt_vid_cap_mplane(file, fh, arg);
|
|
case V4L2_BUF_TYPE_VIDEO_OVERLAY:
|
|
if (unlikely(!ops->vidioc_try_fmt_vid_overlay))
|
|
break;
|
|
- memset_after(p, 0, fmt.win);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.win);
|
|
p->fmt.win.clips = NULL;
|
|
p->fmt.win.clipcount = 0;
|
|
p->fmt.win.bitmap = NULL;
|
|
@@ -1826,17 +1832,17 @@ static int v4l_try_fmt(const struct v4l2_ioctl_ops *ops,
|
|
case V4L2_BUF_TYPE_VBI_CAPTURE:
|
|
if (unlikely(!ops->vidioc_try_fmt_vbi_cap))
|
|
break;
|
|
- memset_after(p, 0, fmt.vbi.flags);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.vbi.flags);
|
|
return ops->vidioc_try_fmt_vbi_cap(file, fh, arg);
|
|
case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE:
|
|
if (unlikely(!ops->vidioc_try_fmt_sliced_vbi_cap))
|
|
break;
|
|
- memset_after(p, 0, fmt.sliced.io_size);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.sliced.io_size);
|
|
return ops->vidioc_try_fmt_sliced_vbi_cap(file, fh, arg);
|
|
case V4L2_BUF_TYPE_VIDEO_OUTPUT:
|
|
if (unlikely(!ops->vidioc_try_fmt_vid_out))
|
|
break;
|
|
- memset_after(p, 0, fmt.pix);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.pix);
|
|
ret = ops->vidioc_try_fmt_vid_out(file, fh, arg);
|
|
/* just in case the driver zeroed it again */
|
|
p->fmt.pix.priv = V4L2_PIX_FMT_PRIV_MAGIC;
|
|
@@ -1844,15 +1850,15 @@ static int v4l_try_fmt(const struct v4l2_ioctl_ops *ops,
|
|
case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
|
|
if (unlikely(!ops->vidioc_try_fmt_vid_out_mplane))
|
|
break;
|
|
- memset_after(p, 0, fmt.pix_mp.xfer_func);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.pix_mp.xfer_func);
|
|
for (i = 0; i < p->fmt.pix_mp.num_planes; i++)
|
|
- memset_after(&p->fmt.pix_mp.plane_fmt[i],
|
|
- 0, bytesperline);
|
|
+ CLEAR_AFTER_FIELD(&p->fmt.pix_mp.plane_fmt[i],
|
|
+ bytesperline);
|
|
return ops->vidioc_try_fmt_vid_out_mplane(file, fh, arg);
|
|
case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
|
|
if (unlikely(!ops->vidioc_try_fmt_vid_out_overlay))
|
|
break;
|
|
- memset_after(p, 0, fmt.win);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.win);
|
|
p->fmt.win.clips = NULL;
|
|
p->fmt.win.clipcount = 0;
|
|
p->fmt.win.bitmap = NULL;
|
|
@@ -1860,32 +1866,32 @@ static int v4l_try_fmt(const struct v4l2_ioctl_ops *ops,
|
|
case V4L2_BUF_TYPE_VBI_OUTPUT:
|
|
if (unlikely(!ops->vidioc_try_fmt_vbi_out))
|
|
break;
|
|
- memset_after(p, 0, fmt.vbi.flags);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.vbi.flags);
|
|
return ops->vidioc_try_fmt_vbi_out(file, fh, arg);
|
|
case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT:
|
|
if (unlikely(!ops->vidioc_try_fmt_sliced_vbi_out))
|
|
break;
|
|
- memset_after(p, 0, fmt.sliced.io_size);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.sliced.io_size);
|
|
return ops->vidioc_try_fmt_sliced_vbi_out(file, fh, arg);
|
|
case V4L2_BUF_TYPE_SDR_CAPTURE:
|
|
if (unlikely(!ops->vidioc_try_fmt_sdr_cap))
|
|
break;
|
|
- memset_after(p, 0, fmt.sdr.buffersize);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.sdr.buffersize);
|
|
return ops->vidioc_try_fmt_sdr_cap(file, fh, arg);
|
|
case V4L2_BUF_TYPE_SDR_OUTPUT:
|
|
if (unlikely(!ops->vidioc_try_fmt_sdr_out))
|
|
break;
|
|
- memset_after(p, 0, fmt.sdr.buffersize);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.sdr.buffersize);
|
|
return ops->vidioc_try_fmt_sdr_out(file, fh, arg);
|
|
case V4L2_BUF_TYPE_META_CAPTURE:
|
|
if (unlikely(!ops->vidioc_try_fmt_meta_cap))
|
|
break;
|
|
- memset_after(p, 0, fmt.meta);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.meta);
|
|
return ops->vidioc_try_fmt_meta_cap(file, fh, arg);
|
|
case V4L2_BUF_TYPE_META_OUTPUT:
|
|
if (unlikely(!ops->vidioc_try_fmt_meta_out))
|
|
break;
|
|
- memset_after(p, 0, fmt.meta);
|
|
+ CLEAR_AFTER_FIELD(p, fmt.meta);
|
|
return ops->vidioc_try_fmt_meta_out(file, fh, arg);
|
|
}
|
|
return -EINVAL;
|
|
@@ -2093,7 +2099,7 @@ static int v4l_reqbufs(const struct v4l2_ioctl_ops *ops,
|
|
if (ret)
|
|
return ret;
|
|
|
|
- memset_after(p, 0, flags);
|
|
+ CLEAR_AFTER_FIELD(p, flags);
|
|
|
|
return ops->vidioc_reqbufs(file, fh, p);
|
|
}
|
|
@@ -2134,7 +2140,7 @@ static int v4l_create_bufs(const struct v4l2_ioctl_ops *ops,
|
|
if (ret)
|
|
return ret;
|
|
|
|
- memset_after(create, 0, flags);
|
|
+ CLEAR_AFTER_FIELD(create, flags);
|
|
|
|
v4l_sanitize_format(&create->format);
|
|
|