Patch "media: v4l2-ioctl.c: use check_fmt for enum/g/s/try_fmt" has been added to the 4.15-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
media: v4l2-ioctl.c: use check_fmt for enum/g/s/try_fmt
to the 4.15-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
media-v4l2-ioctl.c-use-check_fmt-for-enum-g-s-try_fmt.patch
and it can be found in the queue-4.15 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
b2469c814fbc8f1f19676dd4912717b798df511eMon Sep 17 00:00:00 2001
From: Hans Verkuil <[email protected]>
Date: Wed, 24 Jan 2018 08:28:10 -0500
Subject: media: v4l2-ioctl.c: use check_fmt for enum/g/s/try_fmt
From: Hans Verkuil <[email protected]>
commit b2469c814fbc8f1f19676dd4912717b798df511e upstream.
Don't duplicate the buffer type checks in enum/g/s/try_fmt. The check_fmt function does that already.
It is hard to keep the checks in sync for all these functions and in fact the check for VBI was wrong in the _fmt functions as it allowed SDR types as well. This caused a v4l2-compliance failure for /dev/swradio0 using vivid.
This simplifies the code and keeps the check in one place and fixes the SDR/VBI bug.
--- drivers/media/v4l2-core/v4l2-ioctl.c | 140 +++++++++++++---------------------- 1 file changed, 54 insertions(+), 86 deletions(-)
drivers/media/v4l2-core/v4l2-ioctl.c +54 -86
@@ -1311,52 +1311,50 @@ static int v4l_enum_fmt(const struct v4l struct file *file, void *fh, void *arg) { struct v4l2_fmtdesc *p = arg; -struct video_device *vfd =video_devdata (file); -bool is_vid = vfd->vfl_type ==VFL_TYPE_GRABBER ; -bool is_sdr = vfd->vfl_type ==VFL_TYPE_SDR ; -bool is_tch = vfd->vfl_type ==VFL_TYPE_TOUCH ; -bool is_rx = vfd->vfl_dir !=VFL_DIR_TX ; -bool is_tx = vfd->vfl_dir !=VFL_DIR_RX ; -int ret = -EINVAL ; +int ret =check_fmt (file, p->type); + +if (ret) +return ret; + ret = -EINVAL ;switch (p->type) {case V4L2_BUF_TYPE_VIDEO_CAPTURE : -if (unlikely (!is_rx || (!is_vid && !is_tch) || !ops->vidioc_enum_fmt_vid_cap)) +if (unlikely (!ops->vidioc_enum_fmt_vid_cap))break ; ret = ops->vidioc_enum_fmt_vid_cap (file, fh, arg);break ;case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE : -if (unlikely (!is_rx || !is_vid || !ops->vidioc_enum_fmt_vid_cap_mplane)) +if (unlikely (!ops->vidioc_enum_fmt_vid_cap_mplane))break ; ret = ops->vidioc_enum_fmt_vid_cap_mplane (file, fh, arg);break ;case V4L2_BUF_TYPE_VIDEO_OVERLAY : -if (unlikely (!is_rx || !is_vid || !ops->vidioc_enum_fmt_vid_overlay)) +if (unlikely (!ops->vidioc_enum_fmt_vid_overlay))break ; ret = ops->vidioc_enum_fmt_vid_overlay (file, fh, arg);break ;case V4L2_BUF_TYPE_VIDEO_OUTPUT : -if (unlikely (!is_tx || !is_vid || !ops->vidioc_enum_fmt_vid_out)) +if (unlikely (!ops->vidioc_enum_fmt_vid_out))break ; ret = ops->vidioc_enum_fmt_vid_out (file, fh, arg);break ;case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE : -if (unlikely (!is_tx || !is_vid || !ops->vidioc_enum_fmt_vid_out_mplane)) +if (unlikely (!ops->vidioc_enum_fmt_vid_out_mplane))break ; ret = ops->vidioc_enum_fmt_vid_out_mplane (file, fh, arg);break ;case V4L2_BUF_TYPE_SDR_CAPTURE : -if (unlikely (!is_rx || !is_sdr || !ops->vidioc_enum_fmt_sdr_cap)) +if (unlikely (!ops->vidioc_enum_fmt_sdr_cap))break ; ret = ops->vidioc_enum_fmt_sdr_cap (file, fh, arg);break ;case V4L2_BUF_TYPE_SDR_OUTPUT : -if (unlikely (!is_tx || !is_sdr || !ops->vidioc_enum_fmt_sdr_out)) +if (unlikely (!ops->vidioc_enum_fmt_sdr_out))break ; ret = ops->vidioc_enum_fmt_sdr_out (file, fh, arg);break ;case V4L2_BUF_TYPE_META_CAPTURE : -if (unlikely (!is_rx || !is_vid || !ops->vidioc_enum_fmt_meta_cap)) +if (unlikely (!ops->vidioc_enum_fmt_meta_cap))break ; ret = ops->vidioc_enum_fmt_meta_cap (file, fh, arg);break ;
@@ -1370,13 +1368,10 @@ static int v4l_g_fmt(const struct v4l2_i struct file *file, void *fh, void *arg) { struct v4l2_format *p = arg; -struct video_device *vfd =video_devdata (file); -bool is_vid = vfd->vfl_type ==VFL_TYPE_GRABBER ; -bool is_sdr = vfd->vfl_type ==VFL_TYPE_SDR ; -bool is_tch = vfd->vfl_type ==VFL_TYPE_TOUCH ; -bool is_rx = vfd->vfl_dir !=VFL_DIR_TX ; -bool is_tx = vfd->vfl_dir !=VFL_DIR_RX ; -int ret; +int ret =check_fmt (file, p->type); + +if (ret) +return ret;/* * fmt can't be cleared for these overlay types due to the 'clips'
@@ -1404,7 +1399,7 @@ static int v4l_g_fmt(const struct v4l2_iswitch (p->type) {case V4L2_BUF_TYPE_VIDEO_CAPTURE : -if (unlikely (!is_rx || (!is_vid && !is_tch) || !ops->vidioc_g_fmt_vid_cap)) +if (unlikely (!ops->vidioc_g_fmt_vid_cap))break ; p->fmt.pix.priv =V4L2_PIX_FMT_PRIV_MAGIC ; ret = ops->vidioc_g_fmt_vid_cap (file, fh, arg);
@@ -1412,23 +1407,15 @@ static int v4l_g_fmt(const struct v4l2_i p->fmt.pix.priv =V4L2_PIX_FMT_PRIV_MAGIC ;return ret;case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE : -if (unlikely (!is_rx || !is_vid || !ops->vidioc_g_fmt_vid_cap_mplane)) -break ;return ops->vidioc_g_fmt_vid_cap_mplane (file, fh, arg);case V4L2_BUF_TYPE_VIDEO_OVERLAY : -if (unlikely (!is_rx || !is_vid || !ops->vidioc_g_fmt_vid_overlay)) -break ;return ops->vidioc_g_fmt_vid_overlay (file, fh, arg);case V4L2_BUF_TYPE_VBI_CAPTURE : -if (unlikely (!is_rx || is_vid || !ops->vidioc_g_fmt_vbi_cap)) -break ;return ops->vidioc_g_fmt_vbi_cap (file, fh, arg);case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE : -if (unlikely (!is_rx || is_vid || !ops->vidioc_g_fmt_sliced_vbi_cap)) -break ;return ops->vidioc_g_fmt_sliced_vbi_cap (file, fh, arg);case V4L2_BUF_TYPE_VIDEO_OUTPUT : -if (unlikely (!is_tx || !is_vid || !ops->vidioc_g_fmt_vid_out)) +if (unlikely (!ops->vidioc_g_fmt_vid_out))break ; p->fmt.pix.priv =V4L2_PIX_FMT_PRIV_MAGIC ; ret = ops->vidioc_g_fmt_vid_out (file, fh, arg);
@@ -1436,32 +1423,18 @@ static int v4l_g_fmt(const struct v4l2_i p->fmt.pix.priv =V4L2_PIX_FMT_PRIV_MAGIC ;return ret;case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE : -if (unlikely (!is_tx || !is_vid || !ops->vidioc_g_fmt_vid_out_mplane)) -break ;return ops->vidioc_g_fmt_vid_out_mplane (file, fh, arg);case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY : -if (unlikely (!is_tx || !is_vid || !ops->vidioc_g_fmt_vid_out_overlay)) -break ;return ops->vidioc_g_fmt_vid_out_overlay (file, fh, arg);case V4L2_BUF_TYPE_VBI_OUTPUT : -if (unlikely (!is_tx || is_vid || !ops->vidioc_g_fmt_vbi_out)) -break ;return ops->vidioc_g_fmt_vbi_out (file, fh, arg);case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT : -if (unlikely (!is_tx || is_vid || !ops->vidioc_g_fmt_sliced_vbi_out)) -break ;return ops->vidioc_g_fmt_sliced_vbi_out (file, fh, arg);case V4L2_BUF_TYPE_SDR_CAPTURE : -if (unlikely (!is_rx || !is_sdr || !ops->vidioc_g_fmt_sdr_cap)) -break ;return ops->vidioc_g_fmt_sdr_cap (file, fh, arg);case V4L2_BUF_TYPE_SDR_OUTPUT : -if (unlikely (!is_tx || !is_sdr || !ops->vidioc_g_fmt_sdr_out)) -break ;return ops->vidioc_g_fmt_sdr_out (file, fh, arg);case V4L2_BUF_TYPE_META_CAPTURE : -if (unlikely (!is_rx || !is_vid || !ops->vidioc_g_fmt_meta_cap)) -break ;return ops->vidioc_g_fmt_meta_cap (file, fh, arg); }return -EINVAL ;
@@ -1487,12 +1460,10 @@ static int v4l_s_fmt(const struct v4l2_i {struct v4l2_format *p = arg;struct video_device *vfd =video_devdata (file); -bool is_vid = vfd->vfl_type ==VFL_TYPE_GRABBER ; -bool is_sdr = vfd->vfl_type ==VFL_TYPE_SDR ; -bool is_tch = vfd->vfl_type ==VFL_TYPE_TOUCH ; -bool is_rx = vfd->vfl_dir !=VFL_DIR_TX ; -bool is_tx = vfd->vfl_dir !=VFL_DIR_RX ; -int ret; +int ret =check_fmt (file, p->type); + +if (ret) +return ret; ret =v4l_enable_media_source (vfd);if (ret)
@@ -1501,37 +1472,37 @@ static int v4l_s_fmt(const struct v4l2_iswitch (p->type) {case V4L2_BUF_TYPE_VIDEO_CAPTURE : -if (unlikely (!is_rx || (!is_vid && !is_tch) || !ops->vidioc_s_fmt_vid_cap)) +if (unlikely (!ops->vidioc_s_fmt_vid_cap))break ;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 ; -if (is_tch) +if (vfd->vfl_type ==VFL_TYPE_TOUCH )v4l_pix_format_touch (&p->fmt.pix);return ret;case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE : -if (unlikely (!is_rx || !is_vid || !ops->vidioc_s_fmt_vid_cap_mplane)) +if (unlikely (!ops->vidioc_s_fmt_vid_cap_mplane))break ;CLEAR_AFTER_FIELD (p, fmt.pix_mp.xfer_func);return ops->vidioc_s_fmt_vid_cap_mplane (file, fh, arg);case V4L2_BUF_TYPE_VIDEO_OVERLAY : -if (unlikely (!is_rx || !is_vid || !ops->vidioc_s_fmt_vid_overlay)) +if (unlikely (!ops->vidioc_s_fmt_vid_overlay))break ;CLEAR_AFTER_FIELD (p, fmt.win);return ops->vidioc_s_fmt_vid_overlay (file, fh, arg);case V4L2_BUF_TYPE_VBI_CAPTURE : -if (unlikely (!is_rx || is_vid || !ops->vidioc_s_fmt_vbi_cap)) +if (unlikely (!ops->vidioc_s_fmt_vbi_cap))break ;CLEAR_AFTER_FIELD (p, fmt.vbi);return ops->vidioc_s_fmt_vbi_cap (file, fh, arg);case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE : -if (unlikely (!is_rx || is_vid || !ops->vidioc_s_fmt_sliced_vbi_cap)) +if (unlikely (!ops->vidioc_s_fmt_sliced_vbi_cap))break ;CLEAR_AFTER_FIELD (p, fmt.sliced);return ops->vidioc_s_fmt_sliced_vbi_cap (file, fh, arg);case V4L2_BUF_TYPE_VIDEO_OUTPUT : -if (unlikely (!is_tx || !is_vid || !ops->vidioc_s_fmt_vid_out)) +if (unlikely (!ops->vidioc_s_fmt_vid_out))break ;CLEAR_AFTER_FIELD (p, fmt.pix); ret = ops->vidioc_s_fmt_vid_out (file, fh, arg);
@@ -1539,37 +1510,37 @@ static int v4l_s_fmt(const struct v4l2_i p->fmt.pix.priv =V4L2_PIX_FMT_PRIV_MAGIC ;return ret;case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE : -if (unlikely (!is_tx || !is_vid || !ops->vidioc_s_fmt_vid_out_mplane)) +if (unlikely (!ops->vidioc_s_fmt_vid_out_mplane))break ;CLEAR_AFTER_FIELD (p, fmt.pix_mp.xfer_func);return ops->vidioc_s_fmt_vid_out_mplane (file, fh, arg);case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY : -if (unlikely (!is_tx || !is_vid || !ops->vidioc_s_fmt_vid_out_overlay)) +if (unlikely (!ops->vidioc_s_fmt_vid_out_overlay))break ;CLEAR_AFTER_FIELD (p, fmt.win);return ops->vidioc_s_fmt_vid_out_overlay (file, fh, arg);case V4L2_BUF_TYPE_VBI_OUTPUT : -if (unlikely (!is_tx || is_vid || !ops->vidioc_s_fmt_vbi_out)) +if (unlikely (!ops->vidioc_s_fmt_vbi_out))break ;CLEAR_AFTER_FIELD (p, fmt.vbi);return ops->vidioc_s_fmt_vbi_out (file, fh, arg);case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT : -if (unlikely (!is_tx || is_vid || !ops->vidioc_s_fmt_sliced_vbi_out)) +if (unlikely (!ops->vidioc_s_fmt_sliced_vbi_out))break ;CLEAR_AFTER_FIELD (p, fmt.sliced);return ops->vidioc_s_fmt_sliced_vbi_out (file, fh, arg);case V4L2_BUF_TYPE_SDR_CAPTURE : -if (unlikely (!is_rx || !is_sdr || !ops->vidioc_s_fmt_sdr_cap)) +if (unlikely (!ops->vidioc_s_fmt_sdr_cap))break ;CLEAR_AFTER_FIELD (p, fmt.sdr);return ops->vidioc_s_fmt_sdr_cap (file, fh, arg);case V4L2_BUF_TYPE_SDR_OUTPUT : -if (unlikely (!is_tx || !is_sdr || !ops->vidioc_s_fmt_sdr_out)) +if (unlikely (!ops->vidioc_s_fmt_sdr_out))break ;CLEAR_AFTER_FIELD (p, fmt.sdr);return ops->vidioc_s_fmt_sdr_out (file, fh, arg);case V4L2_BUF_TYPE_META_CAPTURE : -if (unlikely (!is_rx || !is_vid || !ops->vidioc_s_fmt_meta_cap)) +if (unlikely (!ops->vidioc_s_fmt_meta_cap))break ;CLEAR_AFTER_FIELD (p, fmt.meta);return ops->vidioc_s_fmt_meta_cap (file, fh, arg);
@@ -1581,19 +1552,16 @@ static int v4l_try_fmt(const struct v4l2 struct file *file, void *fh, void *arg) { struct v4l2_format *p = arg; -struct video_device *vfd =video_devdata (file); -bool is_vid = vfd->vfl_type ==VFL_TYPE_GRABBER ; -bool is_sdr = vfd->vfl_type ==VFL_TYPE_SDR ; -bool is_tch = vfd->vfl_type ==VFL_TYPE_TOUCH ; -bool is_rx = vfd->vfl_dir !=VFL_DIR_TX ; -bool is_tx = vfd->vfl_dir !=VFL_DIR_RX ; -int ret; +int ret =check_fmt (file, p->type); + +if (ret) +return ret;v4l_sanitize_format (p);switch (p->type) {case V4L2_BUF_TYPE_VIDEO_CAPTURE : -if (unlikely (!is_rx || (!is_vid && !is_tch) || !ops->vidioc_try_fmt_vid_cap)) +if (unlikely (!ops->vidioc_try_fmt_vid_cap))break ;CLEAR_AFTER_FIELD (p, fmt.pix); ret = ops->vidioc_try_fmt_vid_cap (file, fh, arg);
@@ -1601,27 +1569,27 @@ static int v4l_try_fmt(const struct v4l2 p->fmt.pix.priv =V4L2_PIX_FMT_PRIV_MAGIC ;return ret;case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE : -if (unlikely (!is_rx || !is_vid || !ops->vidioc_try_fmt_vid_cap_mplane)) +if (unlikely (!ops->vidioc_try_fmt_vid_cap_mplane))break ;CLEAR_AFTER_FIELD (p, fmt.pix_mp.xfer_func);return ops->vidioc_try_fmt_vid_cap_mplane (file, fh, arg);case V4L2_BUF_TYPE_VIDEO_OVERLAY : -if (unlikely (!is_rx || !is_vid || !ops->vidioc_try_fmt_vid_overlay)) +if (unlikely (!ops->vidioc_try_fmt_vid_overlay))break ;CLEAR_AFTER_FIELD (p, fmt.win);return ops->vidioc_try_fmt_vid_overlay (file, fh, arg);case V4L2_BUF_TYPE_VBI_CAPTURE : -if (unlikely (!is_rx || is_vid || !ops->vidioc_try_fmt_vbi_cap)) +if (unlikely (!ops->vidioc_try_fmt_vbi_cap))break ;CLEAR_AFTER_FIELD (p, fmt.vbi);return ops->vidioc_try_fmt_vbi_cap (file, fh, arg);case V4L2_BUF_TYPE_SLICED_VBI_CAPTURE : -if (unlikely (!is_rx || is_vid || !ops->vidioc_try_fmt_sliced_vbi_cap)) +if (unlikely (!ops->vidioc_try_fmt_sliced_vbi_cap))break ;CLEAR_AFTER_FIELD (p, fmt.sliced);return ops->vidioc_try_fmt_sliced_vbi_cap (file, fh, arg);case V4L2_BUF_TYPE_VIDEO_OUTPUT : -if (unlikely (!is_tx || !is_vid || !ops->vidioc_try_fmt_vid_out)) +if (unlikely (!ops->vidioc_try_fmt_vid_out))break ;CLEAR_AFTER_FIELD (p, fmt.pix); ret = ops->vidioc_try_fmt_vid_out (file, fh, arg);
@@ -1629,37 +1597,37 @@ static int v4l_try_fmt(const struct v4l2 p->fmt.pix.priv =V4L2_PIX_FMT_PRIV_MAGIC ;return ret;case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE : -if (unlikely (!is_tx || !is_vid || !ops->vidioc_try_fmt_vid_out_mplane)) +if (unlikely (!ops->vidioc_try_fmt_vid_out_mplane))break ;CLEAR_AFTER_FIELD (p, fmt.pix_mp.xfer_func);return ops->vidioc_try_fmt_vid_out_mplane (file, fh, arg);case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY : -if (unlikely (!is_tx || !is_vid || !ops->vidioc_try_fmt_vid_out_overlay)) +if (unlikely (!ops->vidioc_try_fmt_vid_out_overlay))break ;CLEAR_AFTER_FIELD (p, fmt.win);return ops->vidioc_try_fmt_vid_out_overlay (file, fh, arg);case V4L2_BUF_TYPE_VBI_OUTPUT : -if (unlikely (!is_tx || is_vid || !ops->vidioc_try_fmt_vbi_out)) +if (unlikely (!ops->vidioc_try_fmt_vbi_out))break ;CLEAR_AFTER_FIELD (p, fmt.vbi);return ops->vidioc_try_fmt_vbi_out (file, fh, arg);case V4L2_BUF_TYPE_SLICED_VBI_OUTPUT : -if (unlikely (!is_tx || is_vid || !ops->vidioc_try_fmt_sliced_vbi_out)) +if (unlikely (!ops->vidioc_try_fmt_sliced_vbi_out))break ;CLEAR_AFTER_FIELD (p, fmt.sliced);return ops->vidioc_try_fmt_sliced_vbi_out (file, fh, arg);case V4L2_BUF_TYPE_SDR_CAPTURE : -if (unlikely (!is_rx || !is_sdr || !ops->vidioc_try_fmt_sdr_cap)) +if (unlikely (!ops->vidioc_try_fmt_sdr_cap))break ;CLEAR_AFTER_FIELD (p, fmt.sdr);return ops->vidioc_try_fmt_sdr_cap (file, fh, arg);case V4L2_BUF_TYPE_SDR_OUTPUT : -if (unlikely (!is_tx || !is_sdr || !ops->vidioc_try_fmt_sdr_out)) +if (unlikely (!ops->vidioc_try_fmt_sdr_out))break ;CLEAR_AFTER_FIELD (p, fmt.sdr);return ops->vidioc_try_fmt_sdr_out (file, fh, arg);case V4L2_BUF_TYPE_META_CAPTURE : -if (unlikely (!is_rx || !is_vid || !ops->vidioc_try_fmt_meta_cap)) +if (unlikely (!ops->vidioc_try_fmt_meta_cap))break ;CLEAR_AFTER_FIELD (p, fmt.meta);return ops->vidioc_try_fmt_meta_cap (file, fh, arg);
Patches currently in stable-queue which might be from [email protected] are
queue-4.15/media-hdpvr-fix-an-error-handling-path-in-hdpvr_probe.patch queue-4.15/media-v4l2-compat-ioctl32.c-copy-m.userptr-in-put_v4l2_plane32.patch queue-4.15/media-v4l2-compat-ioctl32.c-avoid-sizeof-type.patch queue-4.15/media-v4l2-compat-ioctl32.c-drop-pr_info-for-unknown-buffer-type.patch queue-4.15/media-v4l2-compat-ioctl32.c-add-missing-vidioc_prepare_buf.patch queue-4.15/media-v4l2-compat-ioctl32.c-refactor-compat-ioctl32-logic.patch queue-4.15/media-v4l2-compat-ioctl32.c-fix-ctrl_is_pointer.patch queue-4.15/media-v4l2-compat-ioctl32.c-move-helper-functions-to-__get-put_v4l2_format32.patch queue-4.15/media-v4l2-compat-ioctl32.c-don-t-copy-back-the-result-for-certain-errors.patch queue-4.15/media-v4l2-compat-ioctl32.c-make-ctrl_is_pointer-work-for-subdevs.patch queue-4.15/media-v4l2-compat-ioctl32.c-fix-the-indentation.patch queue-4.15/media-v4l2-ioctl.c-don-t-copy-back-the-result-for-enotty.patch queue-4.15/media-v4l2-ioctl.c-use-check_fmt-for-enum-g-s-try_fmt.patch queue-4.15/media-v4l2-compat-ioctl32.c-copy-clip-list-in-put_v4l2_window32.patch