summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/load-fragment.c3
-rw-r--r--src/test/test-unit-file.c14
2 files changed, 16 insertions, 1 deletions
diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c
index eea415883b..242b684ddf 100644
--- a/src/core/load-fragment.c
+++ b/src/core/load-fragment.c
@@ -589,7 +589,8 @@ int config_parse_exec(const char *unit,
}
found:
- n = new(char*, k + !separate_argv0);
+ /* If seperate_argv0, we'll move first element to path variable */
+ n = new(char*, MAX(k + !separate_argv0, 1u));
if (!n)
return log_oom();
diff --git a/src/test/test-unit-file.c b/src/test/test-unit-file.c
index d6a7d43915..e517f571d6 100644
--- a/src/test/test-unit-file.c
+++ b/src/test/test-unit-file.c
@@ -137,6 +137,20 @@ static void test_config_parse_exec(void) {
c1 = c1->command_next;
check_execcommand(c1, "/RValue/slashes2", "///argv0", "r1", NULL, false);
+ log_info("/* honour_argv0, no args */");
+ r = config_parse_exec(NULL, "fake", 3, "section", 1,
+ "LValue", 0, "@/RValue",
+ &c, NULL);
+ assert_se(r == 0);
+ assert_se(c1->command_next == NULL);
+
+ log_info("/* no command, check for bad memory access */");
+ r = config_parse_exec(NULL, "fake", 3, "section", 1,
+ "LValue", 0, " ",
+ &c, NULL);
+ assert_se(r == 0);
+ assert_se(c1->command_next == NULL);
+
log_info("/* ignore && honour_argv0 */");
r = config_parse_exec(NULL, "fake", 4, "section", 1,
"LValue", 0, "-@/RValue///slashes3 argv0a r1",