All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Ricardo Ribalda <ribalda@chromium.org>
Cc: Mauro Carvalho Chehab <mchehab@kernel.org>,
	Hans Verkuil <hverkuil-cisco@xs4all.nl>,
	Sergey Senozhatsky <sergey.senozhatsky@gmail.com>,
	linux-media@vger.kernel.org, linux-kernel@vger.kernel.org,
	tfiga@chromium.org, stable@vger.kernel.org
Subject: Re: [PATCH v9 01/22] media: v4l2-ioctl: Fix check_ext_ctrls
Date: Thu, 10 Jun 2021 19:19:43 +0300	[thread overview]
Message-ID: <YMI7n11nRO/tcP1j@pendragon.ideasonboard.com> (raw)
In-Reply-To: <20210326095840.364424-2-ribalda@chromium.org>

Hi Ricardo,

Thank you for the patch.

On Fri, Mar 26, 2021 at 10:58:19AM +0100, Ricardo Ribalda wrote:
> Drivers that do not use the ctrl-framework use this function instead.
> 
> Fix the following issues:
> 
> - Do not check for multiple classes when getting the DEF_VAL.
> - Return -EINVAL for request_api calls
> - Default value cannot be changed, return EINVAL as soon as possible.
> - Return the right error_idx
> [If an error is found when validating the list of controls passed with
> VIDIOC_G_EXT_CTRLS, then error_idx shall be set to ctrls->count to
> indicate to userspace that no actual hardware was touched.
> It would have been much nicer of course if error_idx could point to the
> control index that failed the validation, but sadly that's not how the
> API was designed.]
> 
> Fixes v4l2-compliance:
> Control ioctls (Input 0):
>         warn: v4l2-test-controls.cpp(834): error_idx should be equal to count
>         warn: v4l2-test-controls.cpp(855): error_idx should be equal to count
> 		fail: v4l2-test-controls.cpp(813): doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls)
> 	test VIDIOC_G/S/TRY_EXT_CTRLS: FAIL
> Buffer ioctls (Input 0):
> 		fail: v4l2-test-buffers.cpp(1994): ret != EINVAL && ret != EBADR && ret != ENOTTY
> 	test Requests: FAIL
> 
> Cc: stable@vger.kernel.org
> Fixes: 6fa6f831f095 ("media: v4l2-ctrls: add core request support")
> Suggested-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
> Reviewed-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
> Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> ---
>  drivers/media/v4l2-core/v4l2-ioctl.c | 60 ++++++++++++++++++----------
>  1 file changed, 39 insertions(+), 21 deletions(-)
> 
> diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c
> index 31d1342e61e8..7b5ebdd329e8 100644
> --- a/drivers/media/v4l2-core/v4l2-ioctl.c
> +++ b/drivers/media/v4l2-core/v4l2-ioctl.c
> @@ -908,7 +908,7 @@ static void v4l_print_default(const void *arg, bool write_only)
>  	pr_cont("driver-specific ioctl\n");
>  }
>  
> -static int check_ext_ctrls(struct v4l2_ext_controls *c, int allow_priv)
> +static bool check_ext_ctrls(struct v4l2_ext_controls *c, unsigned long ioctl)
>  {
>  	__u32 i;
>  
> @@ -917,23 +917,41 @@ static int check_ext_ctrls(struct v4l2_ext_controls *c, int allow_priv)
>  	for (i = 0; i < c->count; i++)
>  		c->controls[i].reserved2[0] = 0;
>  
> -	/* V4L2_CID_PRIVATE_BASE cannot be used as control class
> -	   when using extended controls.
> -	   Only when passed in through VIDIOC_G_CTRL and VIDIOC_S_CTRL
> -	   is it allowed for backwards compatibility.
> -	 */
> -	if (!allow_priv && c->which == V4L2_CID_PRIVATE_BASE)
> -		return 0;
> -	if (!c->which)
> -		return 1;
> +	switch (c->which) {
> +	case V4L2_CID_PRIVATE_BASE:
> +		/*
> +		 * V4L2_CID_PRIVATE_BASE cannot be used as control class
> +		 * when using extended controls.
> +		 * Only when passed in through VIDIOC_G_CTRL and VIDIOC_S_CTRL
> +		 * is it allowed for backwards compatibility.
> +		 */
> +		if (ioctl == VIDIOC_G_CTRL || ioctl == VIDIOC_S_CTRL)
> +			return false;
> +		break;
> +	case V4L2_CTRL_WHICH_DEF_VAL:
> +		/* Default value cannot be changed */
> +		if (ioctl == VIDIOC_S_EXT_CTRLS ||
> +		    ioctl == VIDIOC_TRY_EXT_CTRLS) {
> +			c->error_idx = c->count;
> +			return false;
> +		}
> +		return true;
> +	case V4L2_CTRL_WHICH_CUR_VAL:
> +		return true;
> +	case V4L2_CTRL_WHICH_REQUEST_VAL:
> +		c->error_idx = c->count;
> +		return false;
> +	}
> +
>  	/* Check that all controls are from the same control class. */
>  	for (i = 0; i < c->count; i++) {
>  		if (V4L2_CTRL_ID2WHICH(c->controls[i].id) != c->which) {
> -			c->error_idx = i;
> -			return 0;
> +			c->error_idx = ioctl == VIDIOC_TRY_EXT_CTRLS ? i :
> +								      c->count;
> +			return false;
>  		}
>  	}
> -	return 1;
> +	return true;
>  }
>  
>  static int check_fmt(struct file *file, enum v4l2_buf_type type)
> @@ -2229,7 +2247,7 @@ static int v4l_g_ctrl(const struct v4l2_ioctl_ops *ops,
>  	ctrls.controls = &ctrl;
>  	ctrl.id = p->id;
>  	ctrl.value = p->value;
> -	if (check_ext_ctrls(&ctrls, 1)) {
> +	if (check_ext_ctrls(&ctrls, VIDIOC_G_CTRL)) {
>  		int ret = ops->vidioc_g_ext_ctrls(file, fh, &ctrls);
>  
>  		if (ret == 0)
> @@ -2263,7 +2281,7 @@ static int v4l_s_ctrl(const struct v4l2_ioctl_ops *ops,
>  	ctrls.controls = &ctrl;
>  	ctrl.id = p->id;
>  	ctrl.value = p->value;
> -	if (check_ext_ctrls(&ctrls, 1))
> +	if (check_ext_ctrls(&ctrls, VIDIOC_S_CTRL))
>  		return ops->vidioc_s_ext_ctrls(file, fh, &ctrls);
>  	return -EINVAL;
>  }
> @@ -2285,8 +2303,8 @@ static int v4l_g_ext_ctrls(const struct v4l2_ioctl_ops *ops,
>  					vfd, vfd->v4l2_dev->mdev, p);
>  	if (ops->vidioc_g_ext_ctrls == NULL)
>  		return -ENOTTY;
> -	return check_ext_ctrls(p, 0) ? ops->vidioc_g_ext_ctrls(file, fh, p) :
> -					-EINVAL;
> +	return check_ext_ctrls(p, VIDIOC_G_EXT_CTRLS) ?
> +				ops->vidioc_g_ext_ctrls(file, fh, p) : -EINVAL;
>  }
>  
>  static int v4l_s_ext_ctrls(const struct v4l2_ioctl_ops *ops,
> @@ -2306,8 +2324,8 @@ static int v4l_s_ext_ctrls(const struct v4l2_ioctl_ops *ops,
>  					vfd, vfd->v4l2_dev->mdev, p);
>  	if (ops->vidioc_s_ext_ctrls == NULL)
>  		return -ENOTTY;
> -	return check_ext_ctrls(p, 0) ? ops->vidioc_s_ext_ctrls(file, fh, p) :
> -					-EINVAL;
> +	return check_ext_ctrls(p, VIDIOC_S_EXT_CTRLS) ?
> +				ops->vidioc_s_ext_ctrls(file, fh, p) : -EINVAL;
>  }
>  
>  static int v4l_try_ext_ctrls(const struct v4l2_ioctl_ops *ops,
> @@ -2327,8 +2345,8 @@ static int v4l_try_ext_ctrls(const struct v4l2_ioctl_ops *ops,
>  					  vfd, vfd->v4l2_dev->mdev, p);
>  	if (ops->vidioc_try_ext_ctrls == NULL)
>  		return -ENOTTY;
> -	return check_ext_ctrls(p, 0) ? ops->vidioc_try_ext_ctrls(file, fh, p) :
> -					-EINVAL;
> +	return check_ext_ctrls(p, VIDIOC_TRY_EXT_CTRLS) ?
> +			ops->vidioc_try_ext_ctrls(file, fh, p) : -EINVAL;
>  }
>  
>  /*

-- 
Regards,

Laurent Pinchart

  reply	other threads:[~2021-06-10 16:20 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-26  9:58 [PATCH v9 00/22] uvcvideo: Fix v4l2-compliance errors Ricardo Ribalda
2021-03-26  9:58 ` [PATCH v9 01/22] media: v4l2-ioctl: Fix check_ext_ctrls Ricardo Ribalda
2021-06-10 16:19   ` Laurent Pinchart [this message]
2021-03-26  9:58 ` [PATCH v9 02/22] media: pvrusb2: Do not check for V4L2_CTRL_WHICH_DEF_VAL Ricardo Ribalda
2021-06-10 17:29   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 03/22] media: uvcvideo: " Ricardo Ribalda
2021-06-10 16:21   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 04/22] media: v4l2-ioctl: S_CTRL output the right value Ricardo Ribalda
2021-06-10 16:23   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 05/22] media: uvcvideo: Remove s_ctrl and g_ctrl Ricardo Ribalda
2021-06-10 16:24   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 06/22] media: uvcvideo: Set capability in s_param Ricardo Ribalda
2021-03-26  9:58 ` [PATCH v9 07/22] media: uvcvideo: Return -EIO for control errors Ricardo Ribalda
2021-03-26  9:58 ` [PATCH v9 08/22] media: uvcvideo: refactor __uvc_ctrl_add_mapping Ricardo Ribalda
2021-03-26  9:58 ` [PATCH v9 09/22] media: uvcvideo: Add support for V4L2_CTRL_TYPE_CTRL_CLASS Ricardo Ribalda
2021-06-10 16:42   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 10/22] media: uvcvideo: Use dev->name for querycap() Ricardo Ribalda
2021-06-10 16:44   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 11/22] media: uvcvideo: Set unique vdev name based in type Ricardo Ribalda
2021-06-10 16:45   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 12/22] media: uvcvideo: Increase the size of UVC_METADATA_BUF_SIZE Ricardo Ribalda
2021-06-10 16:48   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 13/22] media: uvcvideo: Use control names from framework Ricardo Ribalda
2021-06-10 16:50   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 14/22] media: uvcvideo: Check controls flags before accessing them Ricardo Ribalda
2021-06-10 16:55   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 15/22] media: uvcvideo: Set error_idx during ctrl_commit errors Ricardo Ribalda
2021-06-10 17:05   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 16/22] media: uvcvideo: Return -EACCES to inactive controls Ricardo Ribalda
2021-03-27 11:23   ` Hans Verkuil
2021-06-10 17:28   ` Laurent Pinchart
2021-06-10 18:40     ` Ricardo Ribalda
2021-06-10 19:47       ` Ricardo Ribalda Delgado
2021-03-26  9:58 ` [PATCH v9 17/22] media: docs: Document the behaviour of uvcdriver Ricardo Ribalda
2021-03-27 11:19   ` Hans Verkuil
2021-03-27 12:01     ` Ricardo Ribalda
2021-03-27 12:03       ` Hans Verkuil
2021-06-10 17:08       ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 18/22] media: uvcvideo: Downgrade control error messages Ricardo Ribalda
2021-03-27 11:19   ` Hans Verkuil
2021-06-10 16:59   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 19/22] uvcvideo: uvc_ctrl_is_accessible: check for INACTIVE Ricardo Ribalda
2021-03-27 12:26   ` Ricardo Ribalda Delgado
2021-03-26  9:58 ` [PATCH v9 20/22] uvcvideo: improve error handling in uvc_query_ctrl() Ricardo Ribalda
2021-06-10 17:14   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 21/22] uvcvideo: don't spam the log in uvc_ctrl_restore_values() Ricardo Ribalda
2021-06-10 16:57   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 22/22] uvc: use vb2 ioctl and fop helpers Ricardo Ribalda
2021-04-02  2:50   ` Tomasz Figa
2021-05-25  8:06 ` [PATCH v9 00/22] uvcvideo: Fix v4l2-compliance errors Tomasz Figa

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=YMI7n11nRO/tcP1j@pendragon.ideasonboard.com \
    --to=laurent.pinchart@ideasonboard.com \
    --cc=hverkuil-cisco@xs4all.nl \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=mchehab@kernel.org \
    --cc=ribalda@chromium.org \
    --cc=sergey.senozhatsky@gmail.com \
    --cc=stable@vger.kernel.org \
    --cc=tfiga@chromium.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.