Path and name length should not be placed in constant size buffer but in allocated memory.
Signed-off-by: Krzysztof Opasiak <k.opas...@samsung.com> --- src/usbg.c | 61 ++++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/src/usbg.c b/src/usbg.c index 95fca9a..12ef3f3 100644 --- a/src/usbg.c +++ b/src/usbg.c @@ -44,8 +44,8 @@ struct usbg_state struct usbg_gadget { - char name[USBG_MAX_NAME_LENGTH]; - char path[USBG_MAX_PATH_LENGTH]; + char *name; + char *path; char udc[USBG_MAX_STR_LENGTH]; TAILQ_ENTRY(usbg_gadget) gnode; @@ -436,6 +436,8 @@ static void usbg_free_gadget(usbg_gadget *g) TAILQ_REMOVE(&g->functions, f, fnode); usbg_free_function(f); } + free(g->path); + free(g->name); free(g); } @@ -452,6 +454,30 @@ static void usbg_free_state(usbg_state *s) free(s); } +static usbg_gadget *usbg_allocate_gadget(char *path, char *name, + usbg_state *parent) +{ + usbg_gadget *g; + + g = malloc(sizeof(usbg_gadget)); + if (g) { + TAILQ_INIT(&g->functions); + TAILQ_INIT(&g->configs); + g->name = strdup(name); + g->path = strdup(path); + g->parent = parent; + + if (!(g->name) || !(g->path)) { + free(g->name); + free(g->path); + free(g); + g = NULL; + } + } + + return g; +} + static int usbg_parse_function_net_attrs(usbg_function *f, usbg_function_attrs *f_attrs) { @@ -778,27 +804,20 @@ out: return ret; } -static inline int usbg_parse_gadget(char *path, char *name, usbg_state *parent, - usbg_gadget *g) +static inline int usbg_parse_gadget(usbg_gadget *g) { - int ret = USBG_SUCCESS; - - strcpy(g->name, name); - strcpy(g->path, path); - g->parent = parent; - TAILQ_INIT(&g->functions); - TAILQ_INIT(&g->configs); + int ret; /* UDC bound to, if any */ - ret = usbg_read_string(path, g->name, "UDC", g->udc); + ret = usbg_read_string(g->path, g->name, "UDC", g->udc); if (ret != USBG_SUCCESS) goto out; - ret = usbg_parse_functions(path, g); + ret = usbg_parse_functions(g->path, g); if (ret != USBG_SUCCESS) goto out; - ret = usbg_parse_configs(path, g); + ret = usbg_parse_configs(g->path, g); out: return ret; } @@ -817,9 +836,9 @@ static int usbg_parse_gadgets(char *path, usbg_state *s) * has been created correctly */ if (ret == USBG_SUCCESS) { /* Create new gadget and insert it into list */ - g = malloc(sizeof(usbg_gadget)); + g = usbg_allocate_gadget(path, dent[i]->d_name, s); if (g) { - ret = usbg_parse_gadget(path, dent[i]->d_name, s, g); + ret = usbg_parse_gadget(g); if (ret == USBG_SUCCESS) TAILQ_INSERT_TAIL(&s->gadgets, g, gnode); else @@ -972,16 +991,10 @@ static int usbg_create_empty_gadget(usbg_state *s, char *name, usbg_gadget **g) sprintf(gpath, "%s/%s", s->path, name); - *g = malloc(sizeof(usbg_gadget)); + *g = usbg_allocate_gadget(s->path, name, s); if (*g) { usbg_gadget *gad = *g; /* alias only */ - TAILQ_INIT(&gad->configs); - TAILQ_INIT(&gad->functions); - strcpy(gad->name, name); - strcpy(gad->path, s->path); - gad->parent = s; - ret = mkdir(gpath, S_IRWXU|S_IRWXG|S_IRWXO); if (ret == 0) { /* Should be empty but read the default */ @@ -994,7 +1007,7 @@ static int usbg_create_empty_gadget(usbg_state *s, char *name, usbg_gadget **g) } if (ret != USBG_SUCCESS) { - free(gad); + usbg_free_gadget(*g); *g = NULL; } } else { -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html