ryantimwilson / rpms / systemd

Forked from rpms/systemd 6 days ago
Clone
8d419f
From fdc436432f1ca2dd9df2f24728916ab1201015c1 Mon Sep 17 00:00:00 2001
8d419f
From: Yu Watanabe <watanabe.yu+github@gmail.com>
8d419f
Date: Tue, 5 Apr 2022 21:47:46 +0900
8d419f
Subject: [PATCH] core: command argument can be longer than PATH_MAX
8d419f
8d419f
Fixes a bug introduced by 065364920281e1cf59cab989e17aff21790505c4.
8d419f
8d419f
Fixes #22957.
8d419f
8d419f
(cherry picked from commit 58dd4999dcc81a0ed92fbd78bce3592c3e3afe9e)
8d419f
8d419f
Resolves: #2073994
8d419f
---
8d419f
 src/core/load-fragment.c      |  2 +-
8d419f
 src/test/test-load-fragment.c | 16 ++++++++++++++++
8d419f
 2 files changed, 17 insertions(+), 1 deletion(-)
8d419f
8d419f
diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c
8d419f
index ad5a0912fc..461e073269 100644
8d419f
--- a/src/core/load-fragment.c
8d419f
+++ b/src/core/load-fragment.c
8d419f
@@ -1000,7 +1000,7 @@ int config_parse_exec(
8d419f
                         if (r < 0)
8d419f
                                 return ignore ? 0 : -ENOEXEC;
8d419f
 
8d419f
-                        r = unit_path_printf(u, word, &resolved);
8d419f
+                        r = unit_full_printf(u, word, &resolved);
8d419f
                         if (r < 0) {
8d419f
                                 log_syntax(unit, ignore ? LOG_WARNING : LOG_ERR, filename, line, r,
8d419f
                                            "Failed to resolve unit specifiers in %s%s: %m",
8d419f
diff --git a/src/test/test-load-fragment.c b/src/test/test-load-fragment.c
8d419f
index fbe4744333..c579be4150 100644
8d419f
--- a/src/test/test-load-fragment.c
8d419f
+++ b/src/test/test-load-fragment.c
8d419f
@@ -10,6 +10,7 @@
8d419f
 #include "capability-util.h"
8d419f
 #include "conf-parser.h"
8d419f
 #include "fd-util.h"
8d419f
+#include "fileio.h"
8d419f
 #include "format-util.h"
8d419f
 #include "fs-util.h"
8d419f
 #include "hashmap.h"
8d419f
@@ -416,6 +417,21 @@ TEST(config_parse_exec) {
8d419f
         assert_se(r == 0);
8d419f
         assert_se(c1->command_next == NULL);
8d419f
 
8d419f
+        log_info("/* long arg */"); /* See issue #22957. */
8d419f
+
8d419f
+        char x[LONG_LINE_MAX-100], *y;
8d419f
+        y = mempcpy(x, "/bin/echo ", STRLEN("/bin/echo "));
8d419f
+        memset(y, 'x', sizeof(x) - STRLEN("/bin/echo ") - 1);
8d419f
+        x[sizeof(x) - 1] = '\0';
8d419f
+
8d419f
+        r = config_parse_exec(NULL, "fake", 5, "section", 1,
8d419f
+                              "LValue", 0, x,
8d419f
+                              &c, u);
8d419f
+        assert_se(r >= 0);
8d419f
+        c1 = c1->command_next;
8d419f
+        check_execcommand(c1,
8d419f
+                          "/bin/echo", NULL, y, NULL, false);
8d419f
+
8d419f
         log_info("/* empty argument, reset */");
8d419f
         r = config_parse_exec(NULL, "fake", 4, "section", 1,
8d419f
                               "LValue", 0, "",