OSDN Git Service

usb: gadget: add "usb_validate_langid" function
authorTao Ren <rentao.bupt@gmail.com>
Sun, 15 Mar 2020 19:16:28 +0000 (12:16 -0700)
committerFelipe Balbi <balbi@kernel.org>
Tue, 5 May 2020 07:58:51 +0000 (10:58 +0300)
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>
drivers/usb/gadget/configfs.c
drivers/usb/gadget/usbstring.c
include/linux/usb/gadget.h

index 32b637e..822ef04 100644 (file)
@@ -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;
index 7c24d1c..58a4d33 100644 (file)
@@ -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);
index 9411c08..e959c09 100644 (file)
@@ -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 */