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:
Martin Pitt
2015-05-15 20:02:44 +02:00
committed by Lennart Poettering
parent 6b71bab08d
commit 35b1078e1c
2 changed files with 26 additions and 1 deletions
+5 -1
View File
@@ -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 */
+21
View File
@@ -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);
}