From: David Marchand Date: Fri, 13 Feb 2015 15:03:14 +0000 (+0100) Subject: devargs: remove limit on parameters length X-Git-Url: http://git.droids-corp.org/?p=dpdk.git;a=commitdiff_plain;h=c07691ae10894bb6bf284fed75829b95844eacdb devargs: remove limit on parameters length As far as I know, there is no reason why we should have a limit on the length of parameters that can be given for a device. Remove this limit by using dynamic allocations. Signed-off-by: David Marchand Acked-by: Thomas Monjalon --- diff --git a/lib/librte_eal/common/eal_common_devargs.c b/lib/librte_eal/common/eal_common_devargs.c index 8c9b31ace7..3aace0838a 100644 --- a/lib/librte_eal/common/eal_common_devargs.c +++ b/lib/librte_eal/common/eal_common_devargs.c @@ -49,17 +49,10 @@ int rte_eal_devargs_add(enum rte_devtype devtype, const char *devargs_str) { struct rte_devargs *devargs = NULL; - char buf[RTE_DEVARGS_LEN]; + char *buf = NULL; char *sep; int ret; - ret = snprintf(buf, sizeof(buf), "%s", devargs_str); - if (ret < 0 || ret >= (int)sizeof(buf)) { - RTE_LOG(ERR, EAL, "user device args too large: <%s>\n", - devargs_str); - goto fail; - } - /* use malloc instead of rte_malloc as it's called early at init */ devargs = malloc(sizeof(*devargs)); if (devargs == NULL) { @@ -69,11 +62,21 @@ rte_eal_devargs_add(enum rte_devtype devtype, const char *devargs_str) memset(devargs, 0, sizeof(*devargs)); devargs->type = devtype; + buf = strdup(devargs_str); + if (buf == NULL) { + RTE_LOG(ERR, EAL, "cannot allocate temp memory for devargs\n"); + goto fail; + } + /* set the first ',' to '\0' to split name and arguments */ sep = strchr(buf, ','); if (sep != NULL) { sep[0] = '\0'; - snprintf(devargs->args, sizeof(devargs->args), "%s", sep + 1); + devargs->args = strdup(sep + 1); + if (devargs->args == NULL) { + RTE_LOG(ERR, EAL, "cannot allocate for devargs args\n"); + goto fail; + } } switch (devargs->type) { @@ -97,10 +100,15 @@ rte_eal_devargs_add(enum rte_devtype devtype, const char *devargs_str) break; } + free(buf); TAILQ_INSERT_TAIL(&devargs_list, devargs, next); return 0; fail: + if (devargs->args) + free(devargs->args); + if (buf) + free(buf); if (devargs) free(devargs); return -1; diff --git a/lib/librte_eal/common/include/rte_devargs.h b/lib/librte_eal/common/include/rte_devargs.h index 9f9c98f1aa..996e180537 100644 --- a/lib/librte_eal/common/include/rte_devargs.h +++ b/lib/librte_eal/common/include/rte_devargs.h @@ -88,8 +88,8 @@ struct rte_devargs { char drv_name[32]; } virtual; }; -#define RTE_DEVARGS_LEN 256 - char args[RTE_DEVARGS_LEN]; /**< Arguments string as given by user. */ + /** Arguments string as given by user. */ + char *args; }; /** user device double-linked queue type definition */