Commit f7a7f80c authored by Michal Grzeschik's avatar Michal Grzeschik Committed by Greg Kroah-Hartman
Browse files

usb: gadget: uvc: configfs: ensure guid to be valid before set



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: default avatarMichael Grzeschik <m.grzeschik@pengutronix.de>
Link: https://lore.kernel.org/r/20240221-uvc-gadget-configfs-guid-v1-1-f0678ca62ebb@pengutronix.de


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 7a700d8f
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -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);