diff options
-rw-r--r-- | src/shared/util.c | 3 | ||||
-rw-r--r-- | src/test/test-unit-file.c | 15 |
2 files changed, 16 insertions, 2 deletions
diff --git a/src/shared/util.c b/src/shared/util.c index 4a044840bd..6a883d79d1 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -570,13 +570,12 @@ const char* split(const char **state, size_t *l, const char *separator, bool quo char quotechars[2] = {*current, '\0'}; *l = strcspn_escaped(current + 1, quotechars); - if (current[*l + 1] == '\0' || + if (current[*l + 1] == '\0' || current[*l + 1] != quotechars[0] || (current[*l + 2] && !strchr(separator, current[*l + 2]))) { /* right quote missing or garbage at the end */ *state = current; return NULL; } - assert(current[*l + 1] == quotechars[0]); *state = current++ + *l + 2; } else if (quoted) { *l = strcspn_escaped(current, separator); diff --git a/src/test/test-unit-file.c b/src/test/test-unit-file.c index 22ac76de56..5a9796df58 100644 --- a/src/test/test-unit-file.c +++ b/src/test/test-unit-file.c @@ -91,6 +91,7 @@ static void check_execcommand(ExecCommand *c, static void test_config_parse_exec(void) { /* int config_parse_exec( + const char *unit, const char *filename, unsigned line, const char *section, @@ -302,6 +303,20 @@ static void test_config_parse_exec(void) { assert_se(r == 0); assert_se(c1->command_next == NULL); + log_info("/* missing ending ' */"); + r = config_parse_exec(NULL, "fake", 4, "section", 1, + "LValue", 0, "/path 'foo", + &c, NULL); + assert_se(r == 0); + assert_se(c1->command_next == NULL); + + log_info("/* missing ending ' with trailing backslash */"); + r = config_parse_exec(NULL, "fake", 4, "section", 1, + "LValue", 0, "/path 'foo\\", + &c, NULL); + assert_se(r == 0); + assert_se(c1->command_next == NULL); + exec_command_free_list(c); } |