diff options
| author | Yousong Zhou | 2018-08-11 06:31:28 +0000 |
|---|---|---|
| committer | Yousong Zhou | 2018-08-11 09:38:16 +0000 |
| commit | 4c8b4d6efc8302b508d261573351fffb75bd98c2 (patch) | |
| tree | fded5eed896b6eba95769eb026d1390260fc958b | |
| parent | 5d2bf09ec594d97eb9284b8c721dbfe10b81a6f6 (diff) | |
| download | uci-4c8b4d6efc8302b508d261573351fffb75bd98c2.tar.gz | |
delta: fix parsing malformed delta lines
Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
| -rw-r--r-- | delta.c | 6 | ||||
| -rw-r--r-- | test/tests.d/100_changes | 32 |
2 files changed, 38 insertions, 0 deletions
@@ -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 +} |