]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core: command argument can be longer than PATH_MAX
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 5 Apr 2022 12:47:46 +0000 (21:47 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 5 Apr 2022 15:39:06 +0000 (00:39 +0900)
Fixes a bug introduced by 065364920281e1cf59cab989e17aff21790505c4.

Fixes #22957.

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

index e0dc47ecd8d5248b459d834b71529cf83f62db96..66e0c01c2324f22765d9bc3019d0edf471683407 100644 (file)
@@ -1000,7 +1000,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",
index c3206e1e7ab8b5d7314265e69df676bd581c1a1e..9cbf22312f9716d232cbfb05236db486f0681d9b 100644 (file)
@@ -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"
@@ -416,6 +417,21 @@ TEST(config_parse_exec) {
         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, "",