From a8a4d9a65902b8bfb15395479451070e9644560a Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 5 Apr 2022 21:47:46 +0900 Subject: [PATCH] core: command argument can be longer than PATH_MAX Fixes a bug introduced by 065364920281e1cf59cab989e17aff21790505c4. Fixes #22957. (cherry picked from commit 58dd4999dcc81a0ed92fbd78bce3592c3e3afe9e) (cherry picked from commit 9727b9ee7b90afb8fa0e6328dcb6c34b1522d4fd) Conflict:NA Reference:https://github.com/systemd/systemd-stable/commit/a8a4d9a65902b8bfb15395479451070e9644560a --- src/core/load-fragment.c | 2 +- src/test/test-load-fragment.c | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c index 399a759ad0..cd07f3e60d 100644 --- a/src/core/load-fragment.c +++ b/src/core/load-fragment.c @@ -849,7 +849,7 @@ int config_parse_exec( if (r < 0) return ignore ? 0 : -ENOEXEC; - r = unit_path_printf(u, word, &resolved); + r = unit_full_printf(u, word, &resolved); if (r < 0) { log_syntax(unit, ignore ? LOG_WARNING : LOG_ERR, filename, line, r, "Failed to resolve unit specifiers in %s%s: %m", diff --git a/src/test/test-load-fragment.c b/src/test/test-load-fragment.c index b41a8abf7b..1a0a0579b2 100644 --- a/src/test/test-load-fragment.c +++ b/src/test/test-load-fragment.c @@ -10,6 +10,7 @@ #include "capability-util.h" #include "conf-parser.h" #include "fd-util.h" +#include "fileio.h" #include "format-util.h" #include "fs-util.h" #include "hashmap.h" @@ -412,6 +413,21 @@ static void test_config_parse_exec(void) { assert_se(r == 0); assert_se(c1->command_next == NULL); + log_info("/* long arg */"); /* See issue #22957. */ + + char x[LONG_LINE_MAX-100], *y; + y = mempcpy(x, "/bin/echo ", STRLEN("/bin/echo ")); + memset(y, 'x', sizeof(x) - STRLEN("/bin/echo ") - 1); + x[sizeof(x) - 1] = '\0'; + + r = config_parse_exec(NULL, "fake", 5, "section", 1, + "LValue", 0, x, + &c, u); + assert_se(r >= 0); + c1 = c1->command_next; + check_execcommand(c1, + "/bin/echo", NULL, y, NULL, false); + log_info("/* empty argument, reset */"); r = config_parse_exec(NULL, "fake", 4, "section", 1, "LValue", 0, "", -- 2.33.0