[systemd-commits] src/core src/test

Lennart Poettering lennart at kemper.freedesktop.org
Fri May 15 11:03:16 PDT 2015


 src/core/load-fragment.c  |    6 +++++-
 src/test/test-unit-file.c |   21 +++++++++++++++++++++
 2 files changed, 26 insertions(+), 1 deletion(-)

New commits:
commit 35b1078e1c375df244e19961792aeb78ca34bb54
Author: Martin Pitt <martin.pitt at ubuntu.com>
Date:   Thu May 14 09:06:40 2015 +0200

    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

diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c
index 33d9e27..3865017 100644
--- a/src/core/load-fragment.c
+++ b/src/core/load-fragment.c
@@ -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 */
diff --git a/src/test/test-unit-file.c b/src/test/test-unit-file.c
index f3f6c29..03ca70a 100644
--- a/src/test/test-unit-file.c
+++ b/src/test/test-unit-file.c
@@ -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);
 }
 



More information about the systemd-commits mailing list