Re: [PATCH] media: uvcvideo: Don't expose unsupported formats to userspace

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

 



Hi Ricardo,

On Mon, May 01, 2023 at 01:44:11PM +0200, Ricardo Ribalda wrote:
> Hi Laurent
> 
> I agree with the intent of the patch but am not sure that this will work.
> 
> Regards!
> 
> On Thu, 20 Apr 2023 at 12:07, Laurent Pinchart wrote:
> >
> > When the uvcvideo driver encounters a format descriptor with an unknown
> > format GUID, it creates a corresponding struct uvc_format instance with
> > the fcc field set to 0. Since commit 50459f103edf ("media: uvcvideo:
> > Remove format descriptions"), the driver relies on the V4L2 core to
> > provide the format description string, which the V4L2 core can't do
> > without a valid 4CC. This triggers a WARN_ON.
> >
> > As a format with a zero 4CC can't be selected, it is unusable for
> > applications. Ignore the format completely without creating a uvc_format
> > instance, which fixes the warning.
> >
> > Fixes: 50459f103edf ("media: uvcvideo: Remove format descriptions")
> > Signed-off-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx>
> > ---
> >  drivers/media/usb/uvc/uvc_driver.c | 13 +++++++++----
> >  1 file changed, 9 insertions(+), 4 deletions(-)
> >
> > diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c
> > index de64c9d789fd..25b8199f4e82 100644
> > --- a/drivers/media/usb/uvc/uvc_driver.c
> > +++ b/drivers/media/usb/uvc/uvc_driver.c
> > @@ -251,14 +251,17 @@ static int uvc_parse_format(struct uvc_device *dev,
> >                 /* Find the format descriptor from its GUID. */
> >                 fmtdesc = uvc_format_by_guid(&buffer[5]);
> >
> > -               if (fmtdesc != NULL) {
> > -                       format->fcc = fmtdesc->fcc;
> > -               } else {
> > +               if (!fmtdesc) {
> > +                       /*
> > +                        * Unknown video formats are not fatal errors, the
> > +                        * caller will skip this descriptor.
> > +                        */
> >                         dev_info(&streaming->intf->dev,
> >                                  "Unknown video format %pUl\n", &buffer[5]);
> > -                       format->fcc = 0;
> > +                       return 0;
> >                 }
> >
> > +               format->fcc = fmtdesc->fcc;
> >                 format->bpp = buffer[21];
> >
> >                 /*
> > @@ -689,6 +692,8 @@ static int uvc_parse_streaming(struct uvc_device *dev,
> >                                 &interval, buffer, buflen);
> 
> For devices with unknown formats streaming->nformats will not be
> valid, it will be higher than the actual formats on
> streaming->formats.

Indeed. I think this could be handled quite simply:

diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c
index d966d003632b..cc6608eb3ab9 100644
--- a/drivers/media/usb/uvc/uvc_driver.c
+++ b/drivers/media/usb/uvc/uvc_driver.c
@@ -679,7 +679,7 @@ static int uvc_parse_streaming(struct uvc_device *dev,
 	interval = (u32 *)&frame[nframes];

 	streaming->formats = format;
-	streaming->nformats = nformats;
+	streaming->nformats = 0;

 	/* Parse the format descriptors. */
 	while (buflen > 2 && buffer[1] == USB_DT_CS_INTERFACE) {
@@ -695,6 +695,7 @@ static int uvc_parse_streaming(struct uvc_device *dev,
 			if (!ret)
 				break;

+			streaming->nformats++;
 			frame += format->nframes;
 			format++;

What do you think ? I can submit a v2 with this change.

> >                         if (ret < 0)
> >                                 goto error;
> > +                       if (!ret)
> > +                               break;
> >
> >                         frame += format->nframes;
> >                         format++;

-- 
Regards,

Laurent Pinchart



[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