Zbigniew Jędrzejewski-Szmek a94605
From 064e901cb34b1a3dddbbe98595a2731bb85c4424 Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek a94605
From: Lennart Poettering <lennart@poettering.net>
Zbigniew Jędrzejewski-Szmek a94605
Date: Wed, 29 May 2024 11:46:51 +0200
Zbigniew Jędrzejewski-Szmek a94605
Subject: [PATCH 2/3] exec-util: use the stdio array of safe_fork_full() where
Zbigniew Jędrzejewski-Szmek a94605
 appropriate
Zbigniew Jędrzejewski-Szmek a94605
Zbigniew Jędrzejewski-Szmek a94605
---
Zbigniew Jędrzejewski-Szmek a94605
 src/shared/exec-util.c | 28 ++++++++++++++++++----------
Zbigniew Jędrzejewski-Szmek a94605
 1 file changed, 18 insertions(+), 10 deletions(-)
Zbigniew Jędrzejewski-Szmek a94605
Zbigniew Jędrzejewski-Szmek a94605
diff --git a/src/shared/exec-util.c b/src/shared/exec-util.c
Zbigniew Jędrzejewski-Szmek a94605
index 1c7b14d98d..dc0974572f 100644
Zbigniew Jędrzejewski-Szmek a94605
--- a/src/shared/exec-util.c
Zbigniew Jędrzejewski-Szmek a94605
+++ b/src/shared/exec-util.c
Zbigniew Jędrzejewski-Szmek a94605
@@ -36,27 +36,35 @@
Zbigniew Jędrzejewski-Szmek a94605
 /* Put this test here for a lack of better place */
Zbigniew Jędrzejewski-Szmek a94605
 assert_cc(EAGAIN == EWOULDBLOCK);
Zbigniew Jędrzejewski-Szmek a94605
 
Zbigniew Jędrzejewski-Szmek a94605
-static int do_spawn(const char *path, char *argv[], int stdout_fd, pid_t *pid, bool set_systemd_exec_pid) {
Zbigniew Jędrzejewski-Szmek a94605
-        pid_t _pid;
Zbigniew Jędrzejewski-Szmek a94605
+static int do_spawn(
Zbigniew Jędrzejewski-Szmek a94605
+                const char *path,
Zbigniew Jędrzejewski-Szmek a94605
+                char *argv[],
Zbigniew Jędrzejewski-Szmek a94605
+                int stdout_fd,
Zbigniew Jędrzejewski-Szmek a94605
+                pid_t *ret_pid,
Zbigniew Jędrzejewski-Szmek a94605
+                bool set_systemd_exec_pid) {
Zbigniew Jędrzejewski-Szmek a94605
+
Zbigniew Jędrzejewski-Szmek a94605
         int r;
Zbigniew Jędrzejewski-Szmek a94605
 
Zbigniew Jędrzejewski-Szmek a94605
+        assert(path);
Zbigniew Jędrzejewski-Szmek a94605
+        assert(ret_pid);
Zbigniew Jędrzejewski-Szmek a94605
+
Zbigniew Jędrzejewski-Szmek a94605
         if (null_or_empty_path(path) > 0) {
Zbigniew Jędrzejewski-Szmek a94605
                 log_debug("%s is empty (a mask).", path);
Zbigniew Jędrzejewski-Szmek a94605
                 return 0;
Zbigniew Jędrzejewski-Szmek a94605
         }
Zbigniew Jędrzejewski-Szmek a94605
 
Zbigniew Jędrzejewski-Szmek a94605
-        r = safe_fork("(direxec)", FORK_DEATHSIG_SIGTERM|FORK_LOG|FORK_RLIMIT_NOFILE_SAFE, &_pid);
Zbigniew Jędrzejewski-Szmek a94605
+        pid_t pid;
Zbigniew Jędrzejewski-Szmek a94605
+        r = safe_fork_full(
Zbigniew Jędrzejewski-Szmek a94605
+                        "(direxec)",
Zbigniew Jędrzejewski-Szmek a94605
+                        (const int[]) { STDIN_FILENO, stdout_fd < 0 ? STDOUT_FILENO : stdout_fd, STDERR_FILENO },
Zbigniew Jędrzejewski-Szmek a94605
+                        /* except_fds= */ NULL, /* n_except_fds= */ 0,
Zbigniew Jędrzejewski-Szmek a94605
+                        FORK_DEATHSIG_SIGTERM|FORK_LOG|FORK_RLIMIT_NOFILE_SAFE|FORK_REARRANGE_STDIO,
Zbigniew Jędrzejewski-Szmek a94605
+                        &pid;;
Zbigniew Jędrzejewski-Szmek a94605
         if (r < 0)
Zbigniew Jędrzejewski-Szmek a94605
                 return r;
Zbigniew Jędrzejewski-Szmek a94605
         if (r == 0) {
Zbigniew Jędrzejewski-Szmek a94605
                 char *_argv[2];
Zbigniew Jędrzejewski-Szmek a94605
 
Zbigniew Jędrzejewski-Szmek a94605
-                if (stdout_fd >= 0) {
Zbigniew Jędrzejewski-Szmek a94605
-                        r = rearrange_stdio(STDIN_FILENO, TAKE_FD(stdout_fd), STDERR_FILENO);
Zbigniew Jędrzejewski-Szmek a94605
-                        if (r < 0)
Zbigniew Jędrzejewski-Szmek a94605
-                                _exit(EXIT_FAILURE);
Zbigniew Jędrzejewski-Szmek a94605
-                }
Zbigniew Jędrzejewski-Szmek a94605
-
Zbigniew Jędrzejewski-Szmek a94605
                 if (set_systemd_exec_pid) {
Zbigniew Jędrzejewski-Szmek a94605
                         r = setenv_systemd_exec_pid(false);
Zbigniew Jędrzejewski-Szmek a94605
                         if (r < 0)
Zbigniew Jędrzejewski-Szmek a94605
@@ -75,7 +83,7 @@ static int do_spawn(const char *path, char *argv[], int stdout_fd, pid_t *pid, b
Zbigniew Jędrzejewski-Szmek a94605
                 _exit(EXIT_FAILURE);
Zbigniew Jędrzejewski-Szmek a94605
         }
Zbigniew Jędrzejewski-Szmek a94605
 
Zbigniew Jędrzejewski-Szmek a94605
-        *pid = _pid;
Zbigniew Jędrzejewski-Szmek a94605
+        *ret_pid = pid;
Zbigniew Jędrzejewski-Szmek a94605
         return 1;
Zbigniew Jędrzejewski-Szmek a94605
 }
Zbigniew Jędrzejewski-Szmek a94605
 
Zbigniew Jędrzejewski-Szmek a94605
-- 
Zbigniew Jędrzejewski-Szmek a94605
2.45.0
Zbigniew Jędrzejewski-Szmek a94605