Re: [PATCHv2 04/15] v4l2-subdev: without controls return -ENOTTY

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Feb 09, 2018 at 01:48:49PM +0100, Hans Verkuil wrote:
> On 02/09/18 13:38, Sakari Ailus wrote:
> > Hi Hans,
> > 
> > On Fri, Feb 09, 2018 at 12:56:37PM +0100, Hans Verkuil wrote:
> >> On 02/09/18 12:46, Sakari Ailus wrote:
> >>> Hi Hans,
> >>>
> >>> On Thu, Feb 08, 2018 at 09:36:44AM +0100, Hans Verkuil wrote:
> >>>> If the subdev did not define any controls, then return -ENOTTY if
> >>>> userspace attempts to call these ioctls.
> >>>>
> >>>> The control framework functions will return -EINVAL, not -ENOTTY if
> >>>> vfh->ctrl_handler is NULL.
> >>>>
> >>>> Several of these framework functions are also called directly from
> >>>> drivers, so I don't want to change the error code there.
> >>>>
> >>>> Found with vimc and v4l2-compliance.
> >>>>
> >>>> Signed-off-by: Hans Verkuil <hans.verkuil@xxxxxxxxx>
> >>>
> >>> Thanks for the patch.
> >>>
> >>> If the handler is NULL, can there be support for the IOCTL at all? I.e.
> >>> should the missing handler as such result in returning -ENOTTY from these
> >>> functions instead of -EINVAL?
> >>
> >> I didn't dare change the control framework. Some of these v4l2_... functions
> >> are called by drivers and I didn't want to analyze them all. If these
> >> functions were only called by v4l2-ioctl.c and v4l2-subdev.c, then I'd have
> >> changed it in v4l2-ctrls.c, but that's not the case.
> >>
> >> It would be a useful project to replace all calls from drivers to these
> >> functions (they really shouldn't be used by drivers), but that is out-of-scope
> >> of this patch.
> > 
> > Is your concern that the caller could check the return value and do
> > something based on particular error code it gets?
> 
> Or that the handler is NULL and it returns ENOTTY to userspace. You can have
> multiple control handlers, some of which might be NULL. It's all unlikely,
> but the code needs to be analyzed and that takes time. Hmm, atomisp is
> definitely a big user of these functions.
> 
> Also, the real issue is the use of these functions by drivers. What I want
> to do is to have the drivers use the proper functions, then I can move those
> functions to the core and stop exporting them. And at that moment they can
> return -ENOTTY instead of -EINVAL.
> 
> A worthwhile project, but right now I just want to fix v4l2-subdev.c.

Fair enough. How about adding a TODO comment on this in either in the
control framework or where the additional checks are now put, to avoid
forgetting it?

With that,

Acked-by: Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx>

> 
> Regards,
> 
> 	Hans
> 
> > Based on a quick glance there are a few tens of places these functions are
> > used in drivers. Some seems legitimate; the caller having another device
> > where a control needs to be accessed, for instance.
> > 
> > And if handler is NULL, -ENOTTY appears to be a more suitable return value
> > in a lot of the cases (and in many others it makes no difference).
> > 
> > I wouldn't say this is something that should hold back addressing this in
> > the control framework instead.
> > 
> > I can submit a patch if you'd prefer that instead.
> > 
> >>
> >> Regards,
> >>
> >> 	Hans
> >>
> >>>
> >>>> ---
> >>>>  drivers/media/v4l2-core/v4l2-subdev.c | 16 ++++++++++++++++
> >>>>  1 file changed, 16 insertions(+)
> >>>>
> >>>> diff --git a/drivers/media/v4l2-core/v4l2-subdev.c b/drivers/media/v4l2-core/v4l2-subdev.c
> >>>> index 43fefa73e0a3..be7a19272614 100644
> >>>> --- a/drivers/media/v4l2-core/v4l2-subdev.c
> >>>> +++ b/drivers/media/v4l2-core/v4l2-subdev.c
> >>>> @@ -187,27 +187,43 @@ static long subdev_do_ioctl(struct file *file, unsigned int cmd, void *arg)
> >>>>  
> >>>>  	switch (cmd) {
> >>>>  	case VIDIOC_QUERYCTRL:
> >>>> +		if (!vfh->ctrl_handler)
> >>>> +			return -ENOTTY;
> >>>>  		return v4l2_queryctrl(vfh->ctrl_handler, arg);
> >>>>  
> >>>>  	case VIDIOC_QUERY_EXT_CTRL:
> >>>> +		if (!vfh->ctrl_handler)
> >>>> +			return -ENOTTY;
> >>>>  		return v4l2_query_ext_ctrl(vfh->ctrl_handler, arg);
> >>>>  
> >>>>  	case VIDIOC_QUERYMENU:
> >>>> +		if (!vfh->ctrl_handler)
> >>>> +			return -ENOTTY;
> >>>>  		return v4l2_querymenu(vfh->ctrl_handler, arg);
> >>>>  
> >>>>  	case VIDIOC_G_CTRL:
> >>>> +		if (!vfh->ctrl_handler)
> >>>> +			return -ENOTTY;
> >>>>  		return v4l2_g_ctrl(vfh->ctrl_handler, arg);
> >>>>  
> >>>>  	case VIDIOC_S_CTRL:
> >>>> +		if (!vfh->ctrl_handler)
> >>>> +			return -ENOTTY;
> >>>>  		return v4l2_s_ctrl(vfh, vfh->ctrl_handler, arg);
> >>>>  
> >>>>  	case VIDIOC_G_EXT_CTRLS:
> >>>> +		if (!vfh->ctrl_handler)
> >>>> +			return -ENOTTY;
> >>>>  		return v4l2_g_ext_ctrls(vfh->ctrl_handler, arg);
> >>>>  
> >>>>  	case VIDIOC_S_EXT_CTRLS:
> >>>> +		if (!vfh->ctrl_handler)
> >>>> +			return -ENOTTY;
> >>>>  		return v4l2_s_ext_ctrls(vfh, vfh->ctrl_handler, arg);
> >>>>  
> >>>>  	case VIDIOC_TRY_EXT_CTRLS:
> >>>> +		if (!vfh->ctrl_handler)
> >>>> +			return -ENOTTY;
> >>>>  		return v4l2_try_ext_ctrls(vfh->ctrl_handler, arg);
> >>>>  
> >>>>  	case VIDIOC_DQEVENT:
> >>>
> >>
> > 
> 

-- 
Sakari Ailus
e-mail: sakari.ailus@xxxxxx



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux