From e01ff428993f0c126f010b5625002e6a0a8aff4a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sun, 11 Jan 2015 16:57:02 -0500 Subject: [PATCH] core/load-fragment: avoid allocating 0 bytes when given an invalid command With a command line like "@/something" we would allocate an array with 0 elements. Avoid that, and add a test too. --- src/core/load-fragment.c | 3 ++- src/test/test-unit-file.c | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c index eea415883..242b684dd 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 d6a7d4391..e517f571d 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", -- 2.30.2