X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fuci.git;a=blobdiff_plain;f=file.c;h=4b607f803aa283b8baa77caeb547f7a9fc65ca6d;hp=a3d08d2679ffe369675b0ec3a288dd4088c051b8;hb=60d40fa1a8c366ae7a9db2082720395d3dc7c7d8;hpb=b12bd89466dfb7adf38b71c039a0d56704492e95 diff --git a/file.c b/file.c index a3d08d2..4b607f8 100644 --- a/file.c +++ b/file.c @@ -210,6 +210,9 @@ static void parse_str(struct uci_context *ctx, char **str, char **target) case '"': parse_double_quote(ctx, str, target); break; + case '#': + **str = 0; + /* fall through */ case 0: goto done; case '\\': @@ -451,6 +454,8 @@ static void uci_parse_line(struct uci_context *ctx, bool single) word = strtok_r(word, " \t", &pbrk); switch(word[0]) { + case '#': + return; case 'p': if ((word[1] == 0) || !strcmp(word + 1, "ackage")) uci_parse_package(ctx, &word, single); @@ -576,8 +581,10 @@ int uci_import(struct uci_context *ctx, FILE *stream, const char *name, struct u * the appropriate 'package ' string to specify the config name * NB: the config file can still override the package name */ - if (name) + if (name) { + UCI_ASSERT(ctx, uci_validate_name(name)); pctx->name = name; + } while (!feof(pctx->file)) { uci_getln(ctx, 0); @@ -682,14 +689,14 @@ static void uci_parse_history_line(struct uci_context *ctx, struct uci_package * } UCI_INTERNAL(uci_parse_tuple, ctx, buf, &package, §ion, &option, &value); - if (!package || !section || (!delete && !value)) - goto error; - if (strcmp(package, p->e.name) != 0) + if (!package || (strcmp(package, p->e.name) != 0)) goto error; if (!uci_validate_name(section)) goto error; if (option && !uci_validate_name(option)) goto error; + if ((rename || !delete) && !uci_validate_name(value)) + goto error; if (rename) UCI_INTERNAL(uci_rename, ctx, p, section, option, value); @@ -741,6 +748,7 @@ static void uci_load_history(struct uci_context *ctx, struct uci_package *p, boo if (!p->confdir) return; + if ((asprintf(&filename, "%s/%s", UCI_SAVEDIR, p->e.name) < 0) || !filename) UCI_THROW(ctx, UCI_ERR_MEM); @@ -766,8 +774,7 @@ static char *uci_config_path(struct uci_context *ctx, const char *name) { char *filename; - if (strchr(name, '/')) - UCI_THROW(ctx, UCI_ERR_INVAL); + UCI_ASSERT(ctx, uci_validate_name(name)); filename = uci_malloc(ctx, strlen(name) + sizeof(UCI_CONFDIR) + 2); sprintf(filename, UCI_CONFDIR "/%s", name); @@ -796,7 +803,6 @@ int uci_load(struct uci_context *ctx, const char *name, struct uci_package **pac break; default: /* config in /etc/config */ - UCI_ASSERT(ctx, uci_validate_name(name)); filename = uci_config_path(ctx, name); confdir = true; break; @@ -906,8 +912,14 @@ int uci_commit(struct uci_context *ctx, struct uci_package **package, bool overw if (!overwrite) { name = uci_strdup(ctx, p->e.name); path = uci_strdup(ctx, p->path); + /* dump our own changes to the history file */ if (!uci_list_empty(&p->history)) UCI_INTERNAL(uci_save, ctx, p); + + /* + * other processes might have modified the config + * as well. dump and reload + */ uci_free_package(&p); uci_file_cleanup(ctx); UCI_INTERNAL(uci_import, ctx, f, name, &p, true);