summaryrefslogtreecommitdiff
path: root/drivers/usb/gadget
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2017-04-04 03:08:00 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2017-04-04 03:08:00 -0700
commit7d517eef8f04864b7ff9def0c82276c4d45391e7 (patch)
tree60abda6b57e21883802716d2cec7a571873ff31c /drivers/usb/gadget
parent9af69213de642f19b19f77e04f23de9f66b6b0f0 (diff)
parentd3f387805f0e28ef37e142c863c11530c0a3443a (diff)
Merge "CHROMIUM: usb: gadget: configfs: Fix KASAN use-after-free"
Diffstat (limited to 'drivers/usb/gadget')
-rw-r--r--drivers/usb/gadget/configfs.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c
index ed0ff7b1fc15..c31aaf7a9880 100644
--- a/drivers/usb/gadget/configfs.c
+++ b/drivers/usb/gadget/configfs.c
@@ -141,21 +141,28 @@ struct gadget_config_name {
struct list_head list;
};
+#define MAX_USB_STRING_LEN 126
+#define MAX_USB_STRING_WITH_NULL_LEN (MAX_USB_STRING_LEN+1)
+
static int usb_string_copy(const char *s, char **s_copy)
{
int ret;
char *str;
char *copy = *s_copy;
ret = strlen(s);
- if (ret > 126)
+ if (ret > MAX_USB_STRING_LEN)
return -EOVERFLOW;
- str = kstrdup(s, GFP_KERNEL);
- if (!str)
- return -ENOMEM;
+ if (copy) {
+ str = copy;
+ } else {
+ str = kmalloc(MAX_USB_STRING_WITH_NULL_LEN, GFP_KERNEL);
+ if (!str)
+ return -ENOMEM;
+ }
+ strncpy(str, s, MAX_USB_STRING_WITH_NULL_LEN);
if (str[ret - 1] == '\n')
str[ret - 1] = '\0';
- kfree(copy);
*s_copy = str;
return 0;
}