diff mbox series

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

Message ID 20230506065809.24645-1-laurent.pinchart@ideasonboard.com (mailing list archive)
State New, archived
Headers show
Series [v2] media: uvcvideo: Don't expose unsupported formats to userspace | expand

Commit Message

Laurent Pinchart May 6, 2023, 6:58 a.m. UTC
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

Comments

Ricardo Ribalda May 15, 2023, 11:58 a.m. UTC | #1
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 mbox series

Patch

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++;