core: Fix assertion with empty Exec*= paths
An Exec*= line with whitespace after modifiers, like ExecStart=- /bin/true is considered to have an empty command path. This is as specified, but causes systemd to crash with Assertion 'skip < l' failed at ../src/core/load-fragment.c:607, function config_parse_exec(). Aborting. Aborted (core dumped) Fix this by logging an error instead and ignoring the invalid line. Add corresponding test cases. Also add a test case for a completely empty value which resets the command list. https://launchpad.net/bugs/1454173
This commit is contained in:
committed by
Lennart Poettering
parent
6b71bab08d
commit
35b1078e1c
@@ -595,7 +595,11 @@ int config_parse_exec(
|
||||
skip = separate_argv0 + ignore;
|
||||
|
||||
/* skip special chars in the beginning */
|
||||
assert(skip < l);
|
||||
if (l <= skip) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, EINVAL, "Empty path in command line, ignoring: %s", rvalue);
|
||||
r = 0;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
} else if (strneq(word, ";", MAX(l, 1U)))
|
||||
/* new commandline */
|
||||
|
||||
@@ -317,6 +317,27 @@ static void test_config_parse_exec(void) {
|
||||
assert_se(r == 0);
|
||||
assert_se(c1->command_next == NULL);
|
||||
|
||||
log_info("/* invalid space between modifiers */");
|
||||
r = config_parse_exec(NULL, "fake", 4, "section", 1,
|
||||
"LValue", 0, "- /path",
|
||||
&c, NULL);
|
||||
assert_se(r == 0);
|
||||
assert_se(c1->command_next == NULL);
|
||||
|
||||
log_info("/* only modifiers, no path */");
|
||||
r = config_parse_exec(NULL, "fake", 4, "section", 1,
|
||||
"LValue", 0, "-",
|
||||
&c, NULL);
|
||||
assert_se(r == 0);
|
||||
assert_se(c1->command_next == NULL);
|
||||
|
||||
log_info("/* empty argument, reset */");
|
||||
r = config_parse_exec(NULL, "fake", 4, "section", 1,
|
||||
"LValue", 0, "",
|
||||
&c, NULL);
|
||||
assert_se(r == 0);
|
||||
assert_se(c == NULL);
|
||||
|
||||
exec_command_free_list(c);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user