diff options
Diffstat (limited to 'tools/env')
-rw-r--r-- | tools/env/fw_env.c | 33 |
1 files changed, 13 insertions, 20 deletions
diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c index 57ad8c9db7e..ccaa8896318 100644 --- a/tools/env/fw_env.c +++ b/tools/env/fw_env.c @@ -478,7 +478,6 @@ int fw_setenv(int argc, char *argv[]) int i, len; char *name; char *value = NULL; - char *tmpval = NULL; if (argc < 2) { errno = EINVAL; @@ -492,34 +491,28 @@ int fw_setenv(int argc, char *argv[]) name = argv[1]; - len = strlen(name) + 2; - for (i = 2; i < argc; ++i) - len += strlen(argv[i]) + 1; - - /* Allocate enough place to the data string */ + len = 0; for (i = 2; i < argc; ++i) { char *val = argv[i]; + size_t val_len = strlen(val); + + value = realloc(value, len + val_len + 1); if (!value) { - value = (char *)malloc(len - strlen(name)); - if (!value) { - fprintf(stderr, + fprintf(stderr, "Cannot malloc %zu bytes: %s\n", - len - strlen(name), strerror(errno)); - return -1; - } - memset(value, 0, len - strlen(name)); - tmpval = value; + len, strerror(errno)); + return -1; } - if (i != 2) - *tmpval++ = ' '; - while (*val != '\0') - *tmpval++ = *val++; + + memcpy(value + len, val, val_len); + len += val_len; + value[len++] = ' '; } + value[len - 1] = '\0'; fw_env_write(name, value); - if (value) - free(value); + free(value); return fw_env_close(); } |