mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-20 11:13:58 +08:00
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: Tao Ren <rentao.bupt@gmail.com> Signed-off-by: Felipe Balbi <balbi@kernel.org>
This commit is contained in:
parent
5cc0710f23
commit
17309a6a43
@ -13,8 +13,6 @@
|
|||||||
int check_user_usb_string(const char *name,
|
int check_user_usb_string(const char *name,
|
||||||
struct usb_gadget_strings *stringtab_dev)
|
struct usb_gadget_strings *stringtab_dev)
|
||||||
{
|
{
|
||||||
unsigned primary_lang;
|
|
||||||
unsigned sub_lang;
|
|
||||||
u16 num;
|
u16 num;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@ -22,17 +20,7 @@ int check_user_usb_string(const char *name,
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
primary_lang = num & 0x3ff;
|
if (!usb_validate_langid(num))
|
||||||
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)
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
stringtab_dev->language = num;
|
stringtab_dev->language = num;
|
||||||
|
@ -65,3 +65,27 @@ usb_gadget_get_string (const struct usb_gadget_strings *table, int id, u8 *buf)
|
|||||||
return buf [0];
|
return buf [0];
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(usb_gadget_get_string);
|
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);
|
||||||
|
@ -773,6 +773,9 @@ struct usb_gadget_string_container {
|
|||||||
/* put descriptor for string with that id into buf (buflen >= 256) */
|
/* 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);
|
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 */
|
/* utility to simplify managing config descriptors */
|
||||||
|
Loading…
Reference in New Issue
Block a user