delta: fix parsing malformed delta lines
authorYousong Zhou <yszhou4tech@gmail.com>
Sat, 11 Aug 2018 06:31:28 +0000 (06:31 +0000)
committerYousong Zhou <yszhou4tech@gmail.com>
Sat, 11 Aug 2018 09:38:16 +0000 (09:38 +0000)
Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
delta.c
test/tests.d/100_changes [new file with mode: 0644]

diff --git a/delta.c b/delta.c
index e9c79ab5be07b80058869b8a4ba69c04cee3de44..386167db4cd1500b56f80d0e3d29f82594cafa2a 100644 (file)
--- 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 (file)
index 0000000..cb9cfdf
--- /dev/null
@@ -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
+}