parser: fix precedence of quoting over ; as command terminator, thx to netprince...
authorFelix Fietkau <nbd@openwrt.org>
Tue, 8 Apr 2008 19:20:41 +0000 (21:20 +0200)
committerFelix Fietkau <nbd@openwrt.org>
Tue, 8 Apr 2008 19:20:41 +0000 (21:20 +0200)
file.c
util.c

diff --git a/file.c b/file.c
index 740b1d5..5360ef7 100644 (file)
--- a/file.c
+++ b/file.c
@@ -35,6 +35,7 @@ static void assert_eol(struct uci_context *ctx, char **str)
 {
        char *tmp;
 
 {
        char *tmp;
 
+       skip_whitespace(ctx, str);
        tmp = next_arg(ctx, str, false, false);
        if (*tmp && (ctx->flags & UCI_FLAG_STRICT))
                uci_parse_error(ctx, *str, "too many arguments");
        tmp = next_arg(ctx, str, false, false);
        if (*tmp && (ctx->flags & UCI_FLAG_STRICT))
                uci_parse_error(ctx, *str, "too many arguments");
@@ -169,19 +170,17 @@ error:
 static void uci_parse_line(struct uci_context *ctx, bool single)
 {
        struct uci_parse_context *pctx = ctx->pctx;
 static void uci_parse_line(struct uci_context *ctx, bool single)
 {
        struct uci_parse_context *pctx = ctx->pctx;
-       char *word, *brk = NULL;
-
-       for (word = strtok_r(pctx->buf, ";", &brk);
-                word;
-                word = strtok_r(NULL, ";", &brk)) {
-
-               char *pbrk = NULL;
-               word = strtok_r(word, " \t", &pbrk);
+       char *word, *brk;
 
 
+       word = pctx->buf;
+       do {
+               brk = NULL;
+               word = strtok_r(word, " \t", &brk);
                if (!word)
                if (!word)
-                       continue;
+                       return;
 
                switch(word[0]) {
 
                switch(word[0]) {
+                       case 0:
                        case '#':
                                return;
                        case 'p':
                        case '#':
                                return;
                        case 'p':
@@ -200,7 +199,7 @@ static void uci_parse_line(struct uci_context *ctx, bool single)
                                uci_parse_error(ctx, word, "unterminated command");
                                break;
                }
                                uci_parse_error(ctx, word, "unterminated command");
                                break;
                }
-       }
+       } while (1);
 }
 
 /* max number of characters that escaping adds to the string */
 }
 
 /* max number of characters that escaping adds to the string */
diff --git a/util.c b/util.c
index cba69c3..a85ec9b 100644 (file)
--- a/util.c
+++ b/util.c
@@ -303,6 +303,7 @@ static void parse_single_quote(struct uci_context *ctx, char **str, char **targe
  */
 static void parse_str(struct uci_context *ctx, char **str, char **target)
 {
  */
 static void parse_str(struct uci_context *ctx, char **str, char **target)
 {
+       bool next = true;
        do {
                switch(**str) {
                case '\'':
        do {
                switch(**str) {
                case '\'':
@@ -316,6 +317,9 @@ static void parse_str(struct uci_context *ctx, char **str, char **target)
                        /* fall through */
                case 0:
                        goto done;
                        /* fall through */
                case 0:
                        goto done;
+               case ';':
+                       next = false;
+                       goto done;
                case '\\':
                        if (!parse_backslash(ctx, str))
                                continue;
                case '\\':
                        if (!parse_backslash(ctx, str))
                                continue;
@@ -332,7 +336,7 @@ done:
         * character, skip to the next one, because the whitespace will
         * be overwritten by a null byte here
         */
         * character, skip to the next one, because the whitespace will
         * be overwritten by a null byte here
         */
-       if (**str)
+       if (**str && next)
                *str += 1;
 
        /* terminate the parsed string */
                *str += 1;
 
        /* terminate the parsed string */
@@ -349,7 +353,12 @@ static char *next_arg(struct uci_context *ctx, char **str, bool required, bool n
 
        val = ptr = *str;
        skip_whitespace(ctx, str);
 
        val = ptr = *str;
        skip_whitespace(ctx, str);
-       parse_str(ctx, str, &ptr);
+       if(*str[0] == ';') {
+               *str[0] = 0;
+               *str += 1;
+       } else {
+               parse_str(ctx, str, &ptr);
+       }
        if (!*val) {
                if (required)
                        uci_parse_error(ctx, *str, "insufficient arguments");
        if (!*val) {
                if (required)
                        uci_parse_error(ctx, *str, "insufficient arguments");