diff options
author | Alex Kiernan <alex.kiernan@gmail.com> | 2018-06-07 15:20:05 +0300 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2018-06-13 14:49:12 +0300 |
commit | 94b233f443456a1cb868868b3b7f6876471a2de4 (patch) | |
tree | 1126d88af19403179b7dc4ad73cc7b26fcca3e72 /tools/env/fw_env.c | |
parent | 2aa686775b8facd71f9dce26ce00cf3c5abad51a (diff) | |
download | u-boot-94b233f443456a1cb868868b3b7f6876471a2de4.tar.xz |
tools: env: Use getline rather than fgets when reading config/script
When reading the config file, or a script file, use getline rather than
fgets so line lengths aren't limited by the size of a compiled in buffer
(128 characters for config, 1024 for scripts).
Rename 'dump' to 'line' so it's clear we're working with a line of text.
Signed-off-by: Alex Kiernan <alex.kiernan@gmail.com>
Diffstat (limited to 'tools/env/fw_env.c')
-rw-r--r-- | tools/env/fw_env.c | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c index 4b2caf6960..0b22345a91 100644 --- a/tools/env/fw_env.c +++ b/tools/env/fw_env.c @@ -737,7 +737,8 @@ int fw_env_set(int argc, char *argv[], struct env_opts *opts) int fw_parse_script(char *fname, struct env_opts *opts) { FILE *fp; - char dump[1024]; /* Maximum line length in the file */ + char *line = NULL; + size_t linesize = 0; char *name; char *val; int lineno = 0; @@ -763,36 +764,34 @@ int fw_parse_script(char *fname, struct env_opts *opts) } } - while (fgets(dump, sizeof(dump), fp)) { + while ((len = getline(&line, &linesize, fp)) != -1) { lineno++; - len = strlen(dump); /* - * Read a whole line from the file. If the line is too long - * or is not terminated, reports an error and exit. + * Read a whole line from the file. If the line is not + * terminated, reports an error and exit. */ - if (dump[len - 1] != '\n') { + if (line[len - 1] != '\n') { fprintf(stderr, - "Line %d not corrected terminated or too long\n", + "Line %d not correctly terminated\n", lineno); ret = -1; break; } /* Drop ending line feed / carriage return */ - dump[--len] = '\0'; - if (len && dump[len - 1] == '\r') - dump[--len] = '\0'; + line[--len] = '\0'; + if (len && line[len - 1] == '\r') + line[--len] = '\0'; /* Skip comment or empty lines */ - if (len == 0 || dump[0] == '#') + if (len == 0 || line[0] == '#') continue; /* - * Search for variable's name, - * remove leading whitespaces + * Search for variable's name remove leading whitespaces */ - name = skip_blanks(dump); + name = skip_blanks(line); if (!name) continue; @@ -829,6 +828,7 @@ int fw_parse_script(char *fname, struct env_opts *opts) } } + free(line); /* Close file if not stdin */ if (strcmp(fname, "-") != 0) @@ -1760,19 +1760,20 @@ static int get_config(char *fname) FILE *fp; int i = 0; int rc; - char dump[128]; + char *line = NULL; + size_t linesize = 0; char *devname; fp = fopen(fname, "r"); if (fp == NULL) return -1; - while (i < 2 && fgets(dump, sizeof(dump), fp)) { - /* Skip incomplete conversions and comment strings */ - if (dump[0] == '#') + while (i < 2 && getline(&line, &linesize, fp) != -1) { + /* Skip comment strings */ + if (line[0] == '#') continue; - rc = sscanf(dump, "%ms %lli %lx %lx %lx", + rc = sscanf(line, "%ms %lli %lx %lx %lx", &devname, &DEVOFFSET(i), &ENVSIZE(i), &DEVESIZE(i), &ENVSECTORS(i)); @@ -1788,6 +1789,7 @@ static int get_config(char *fname) i++; } + free(line); fclose(fp); have_redund_env = i - 1; |