usb: gadget: uvc: configfs: ensure guid to be valid before set
authorMichael Grzeschik <m.grzeschik@pengutronix.de>
Wed, 21 Feb 2024 22:14:47 +0000 (23:14 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 26 Mar 2024 09:42:28 +0000 (10:42 +0100)
When setting the guid via configfs it is possible to test if
its value is one of the kernel supported ones by calling
uvc_format_by_guid on it. If the result is NULL, we know the
guid is unsupported and can be ignored.

Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
Link: https://lore.kernel.org/r/20240221-uvc-gadget-configfs-guid-v1-1-f0678ca62ebb@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/gadget/function/uvc_configfs.c

index 7e704b2bcfd1ce5a2c28a4f318fca6633a7072f8..6535e5948b2efd2ee72ac0e603b009ba86c14dca 100644 (file)
@@ -13,6 +13,7 @@
 #include "uvc_configfs.h"
 
 #include <linux/sort.h>
+#include <linux/usb/uvc.h>
 #include <linux/usb/video.h>
 
 /* -----------------------------------------------------------------------------
@@ -2260,6 +2261,8 @@ static ssize_t uvcg_uncompressed_guid_format_store(struct config_item *item,
        struct f_uvc_opts *opts;
        struct config_item *opts_item;
        struct mutex *su_mutex = &ch->fmt.group.cg_subsys->su_mutex;
+       const struct uvc_format_desc *format;
+       u8 tmpguidFormat[sizeof(ch->desc.guidFormat)];
        int ret;
 
        mutex_lock(su_mutex); /* for navigating configfs hierarchy */
@@ -2273,7 +2276,16 @@ static ssize_t uvcg_uncompressed_guid_format_store(struct config_item *item,
                goto end;
        }
 
-       memcpy(ch->desc.guidFormat, page,
+       memcpy(tmpguidFormat, page,
+              min(sizeof(tmpguidFormat), len));
+
+       format = uvc_format_by_guid(tmpguidFormat);
+       if (!format) {
+               ret = -EINVAL;
+               goto end;
+       }
+
+       memcpy(ch->desc.guidFormat, tmpguidFormat,
               min(sizeof(ch->desc.guidFormat), len));
        ret = sizeof(ch->desc.guidFormat);