Browse Source

parser: fix precedence of quoting over ; as command terminator, thx to netprince for spotting the bug

Felix Fietkau 16 years ago
parent
commit
d4bab37948
2 changed files with 20 additions and 12 deletions
  1. 9 10
      file.c
  2. 11 2
      util.c

+ 9 - 10
file.c

@@ -35,6 +35,7 @@ static void assert_eol(struct uci_context *ctx, char **str)
 {
 	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");
@@ -169,19 +170,17 @@ error:
 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)
-			continue;
+			return;
 
 		switch(word[0]) {
+			case 0:
 			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;
 		}
-	}
+	} while (1);
 }
 
 /* max number of characters that escaping adds to the string */

+ 11 - 2
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)
 {
+	bool next = true;
 	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;
+		case ';':
+			next = false;
+			goto done;
 		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
 	 */
-	if (**str)
+	if (**str && next)
 		*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);
-	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");