summaryrefslogtreecommitdiff
path: root/src/shared/util.c
diff options
context:
space:
mode:
authorMartin Pitt <martin.pitt@ubuntu.com>2015-04-22 23:09:43 +0100
committerLennart Poettering <lennart@poettering.net>2015-04-23 01:14:07 +0200
commit470dca63cd2b1579f45f72b6b9777494abeff105 (patch)
tree44fac9a4cf37e9b4841160a9d2f1a88536b1ff8f /src/shared/util.c
parent0674bbea9ce0958512411962c2d1623d88dad0b4 (diff)
util: Fix assertion in split() on missing '
When parsing a unit with a trailing slash after an escaped line break, like ExecStart=/bin/echo 'foo \ bar' the split() function (through config_parse()) asserted and crashed pid 1: Assertion 'current[*l + 1] == quotechars[0]' failed at ../src/shared/util.c:583, function split(). Aborting. Fix this by returning an error in this case ("trailing garbage"). Add corresponding test case. Also fix the missing "unit" argument of config_parse_exec() in the comment. https://launchpad.net/bugs/1447243
Diffstat (limited to 'src/shared/util.c')
-rw-r--r--src/shared/util.c3
1 files changed, 1 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);