Browse Source

delta: fix parsing malformed delta lines

Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
Yousong Zhou 5 years ago
parent
commit
4c8b4d6efc
2 changed files with 38 additions and 0 deletions
  1. 6 0
      delta.c
  2. 32 0
      test/tests.d/100_changes

+ 6 - 0
delta.c

@@ -163,6 +163,9 @@ static inline int uci_parse_delta_tuple(struct uci_context *ctx, struct uci_ptr
 	int c;
 
 	UCI_INTERNAL(uci_parse_argument, ctx, ctx->pctx->file, &str, &arg);
+	if (str && *str) {
+		goto error;
+	}
 	for (c = 0; c <= __UCI_CMD_LAST; c++) {
 		if (uci_command_char[c] == *arg)
 			break;
@@ -179,6 +182,9 @@ static inline int uci_parse_delta_tuple(struct uci_context *ctx, struct uci_ptr
 		goto error;
 	if (ptr->flags & UCI_LOOKUP_EXTENDED)
 		goto error;
+	if (c != UCI_CMD_REMOVE && !ptr->value) {
+		goto error;
+	}
 
 	switch(c) {
 	case UCI_CMD_REORDER:

+ 32 - 0
test/tests.d/100_changes

@@ -0,0 +1,32 @@
+test_changes_tailing_parts()
+{
+	local c val
+	for c in + '' @ ^ '|' '~'; do
+		touch ${CONFIG_DIR}/network
+		cat >${CHANGES_DIR}/network <<-EOF
+			${c}network.foo bar
+			${c}network.foo bar=baz
+			${c}network.foo.bar baz
+			${c}network.foo.bar baz=bazz
+		EOF
+		val=$(${UCI} changes)
+		assertNotSegFault "$?"
+		assertNull "$val"
+	done
+}
+
+test_changes_missing_value()
+{
+	local c val
+	for c in + '' @ ^ '|' '~'; do
+		touch ${CONFIG_DIR}/network
+		mkdir -p ${CHANGES_DIR}
+		cat >${CHANGES_DIR}/network <<-EOF
+			${c}network.foo
+			${c}network.foo.bar
+		EOF
+		val=$(${UCI} changes)
+		assertNotSegFault "$?"
+		assertNull "$val"
+	done
+}