summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYousong Zhou2018-08-11 06:31:28 +0000
committerYousong Zhou2018-08-11 09:38:16 +0000
commit4c8b4d6efc8302b508d261573351fffb75bd98c2 (patch)
treefded5eed896b6eba95769eb026d1390260fc958b
parent5d2bf09ec594d97eb9284b8c721dbfe10b81a6f6 (diff)
downloaduci-4c8b4d6efc8302b508d261573351fffb75bd98c2.tar.gz
delta: fix parsing malformed delta lines
Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
-rw-r--r--delta.c6
-rw-r--r--test/tests.d/100_changes32
2 files changed, 38 insertions, 0 deletions
diff --git a/delta.c b/delta.c
index e9c79ab..386167d 100644
--- a/delta.c
+++ b/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:
diff --git a/test/tests.d/100_changes b/test/tests.d/100_changes
new file mode 100644
index 0000000..cb9cfdf
--- /dev/null
+++ b/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
+}