Message ID | 20230506065809.24645-1-laurent.pinchart@ideasonboard.com |
---|---|
State | Accepted |
Commit | 81f3affa19d6ab0c32aef46b053838219eef7e71 |
Headers | show |
Series | [v2] media: uvcvideo: Don't expose unsupported formats to userspace | expand |
On Sat, 6 May 2023 at 08:58, Laurent Pinchart <laurent.pinchart@ideasonboard.com> 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@ideasonboard.com> Reviewed-by: Ricardo Ribalda <ribalda@chromium.org> > --- > Changes since v1: > > - Fix streaming->nformats > --- > drivers/media/usb/uvc/uvc_driver.c | 16 +++++++++++----- > 1 file changed, 11 insertions(+), 5 deletions(-) > > diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c > index 4be6dfeaa295..8a9cfd5a0077 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]; > > /* > @@ -675,7 +678,7 @@ static int uvc_parse_streaming(struct uvc_device *dev, > interval = (u32 *)&frame[nframes]; > > streaming->format = format; > - streaming->nformats = nformats; > + streaming->nformats = 0; > > /* Parse the format descriptors. */ > while (buflen > 2 && buffer[1] == USB_DT_CS_INTERFACE) { > @@ -689,7 +692,10 @@ static int uvc_parse_streaming(struct uvc_device *dev, > &interval, buffer, buflen); > if (ret < 0) > goto error; > + if (!ret) > + break; > > + streaming->nformats++; > frame += format->nframes; > format++; > > > base-commit: 423f331364bfbcd1212b78ac9052894ff5213ac9 > -- > Regards, > > Laurent Pinchart >
diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c index 4be6dfeaa295..8a9cfd5a0077 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]; /* @@ -675,7 +678,7 @@ static int uvc_parse_streaming(struct uvc_device *dev, interval = (u32 *)&frame[nframes]; streaming->format = format; - streaming->nformats = nformats; + streaming->nformats = 0; /* Parse the format descriptors. */ while (buflen > 2 && buffer[1] == USB_DT_CS_INTERFACE) { @@ -689,7 +692,10 @@ static int uvc_parse_streaming(struct uvc_device *dev, &interval, buffer, buflen); if (ret < 0) goto error; + if (!ret) + break; + streaming->nformats++; frame += format->nframes; format++;
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@ideasonboard.com> --- Changes since v1: - Fix streaming->nformats --- drivers/media/usb/uvc/uvc_driver.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) base-commit: 423f331364bfbcd1212b78ac9052894ff5213ac9