Commit 17309a6a authored by Tao Ren's avatar Tao Ren Committed by Felipe Balbi
Browse files

usb: gadget: add "usb_validate_langid" function



The USB LANGID validation code in "check_user_usb_string" function is
moved to "usb_validate_langid" function which can be used by other usb
gadget drivers.

Signed-off-by: default avatarTao Ren <rentao.bupt@gmail.com>
Signed-off-by: default avatarFelipe Balbi <balbi@kernel.org>
parent 5cc0710f
Loading
Loading
Loading
Loading
+1 −13
Original line number Diff line number Diff line
@@ -13,8 +13,6 @@
int check_user_usb_string(const char *name,
		struct usb_gadget_strings *stringtab_dev)
{
	unsigned primary_lang;
	unsigned sub_lang;
	u16 num;
	int ret;

@@ -22,17 +20,7 @@ int check_user_usb_string(const char *name,
	if (ret)
		return ret;

	primary_lang = num & 0x3ff;
	sub_lang = num >> 10;

	/* simple sanity check for valid langid */
	switch (primary_lang) {
	case 0:
	case 0x62 ... 0xfe:
	case 0x100 ... 0x3ff:
		return -EINVAL;
	}
	if (!sub_lang)
	if (!usb_validate_langid(num))
		return -EINVAL;

	stringtab_dev->language = num;
+24 −0
Original line number Diff line number Diff line
@@ -65,3 +65,27 @@ usb_gadget_get_string (const struct usb_gadget_strings *table, int id, u8 *buf)
	return buf [0];
}
EXPORT_SYMBOL_GPL(usb_gadget_get_string);

/**
 * usb_validate_langid - validate usb language identifiers
 * @lang: usb language identifier
 *
 * Returns true for valid language identifier, otherwise false.
 */
bool usb_validate_langid(u16 langid)
{
	u16 primary_lang = langid & 0x3ff;	/* bit [9:0] */
	u16 sub_lang = langid >> 10;		/* bit [15:10] */

	switch (primary_lang) {
	case 0:
	case 0x62 ... 0xfe:
	case 0x100 ... 0x3ff:
		return false;
	}
	if (!sub_lang)
		return false;

	return true;
}
EXPORT_SYMBOL_GPL(usb_validate_langid);
+3 −0
Original line number Diff line number Diff line
@@ -773,6 +773,9 @@ struct usb_gadget_string_container {
/* put descriptor for string with that id into buf (buflen >= 256) */
int usb_gadget_get_string(const struct usb_gadget_strings *table, int id, u8 *buf);

/* check if the given language identifier is valid */
bool usb_validate_langid(u16 langid);

/*-------------------------------------------------------------------------*/

/* utility to simplify managing config descriptors */