load-fragment: reset the list on an ExecStart= containing only whitespace
authorFilipe Brandenburger <filbranden@google.com>
Sat, 6 Jun 2015 06:12:25 +0000 (23:12 -0700)
committerFilipe Brandenburger <filbranden@google.com>
Wed, 17 Jun 2015 18:12:12 +0000 (11:12 -0700)
This is consistent with how an empty string works in an ExecStart=
statement.  We should not differentiate between an empty string and
whitespace only (since they look the same.)

Update the test case with whitespace only to reflect that the list is
reset.

Tested that `test-unit-file` passes and other test cases are not
affected.  Installed the patched systemd binaries on a machine, booted
it, looked for out of the usual behavior but did not find any.

src/core/load-fragment.c
src/test/test-unit-file.c

index 41ba4c7..a48cb40 100644 (file)
@@ -532,17 +532,15 @@ int config_parse_exec(
 
         e += ltype;
 
-        /* FIXME: ExecStart=<empty> clears the list, but ExecStart=<whitespace>
-         * doesn't, they should behave the same.  */
+        rvalue += strspn(rvalue, WHITESPACE);
+        p = rvalue;
+
         if (isempty(rvalue)) {
                 /* An empty assignment resets the list */
                 *e = exec_command_free_list(*e);
                 return 0;
         }
 
-        rvalue += strspn(rvalue, WHITESPACE);
-        p = rvalue;
-
         do {
                 int i;
                 _cleanup_strv_free_ char **n = NULL;
index c7e8353..8358789 100644 (file)
@@ -145,19 +145,19 @@ static void test_config_parse_exec(void) {
         assert_se(r == 0);
         assert_se(c1->command_next == NULL);
 
-        log_info("/* no command, check for bad memory access */");
+        log_info("/* no command, whitespace only, reset */");
         r = config_parse_exec(NULL, "fake", 3, "section", 1,
                               "LValue", 0, "    ",
                               &c, NULL);
         assert_se(r == 0);
-        assert_se(c1->command_next == NULL);
+        assert_se(c == NULL);
 
         log_info("/* ignore && honour_argv0 */");
         r = config_parse_exec(NULL, "fake", 4, "section", 1,
                               "LValue", 0, "-@/RValue///slashes3 argv0a r1",
                               &c, NULL);
         assert_se(r >= 0);
-        c1 = c1->command_next;
+        c1 = c;
         check_execcommand(c1, "/RValue/slashes3", "argv0a", "r1", NULL, true);
 
         log_info("/* ignore && honour_argv0 */");