Skip to content

Commit 2b33ab0

Browse files
committed
tree-wide: port various places over to use new rearrange_stdio()
1 parent 8bb2db7 commit 2b33ab0

File tree

11 files changed

+38
-168
lines changed

11 files changed

+38
-168
lines changed

src/activate/activate.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -199,15 +199,10 @@ static int exec_process(const char* name, char **argv, char **env, int start_fd,
199199
if (arg_inetd) {
200200
assert(n_fds == 1);
201201

202-
r = dup2(start_fd, STDIN_FILENO);
202+
r = rearrange_stdio(start_fd, start_fd, STDERR_FILENO); /* invalidates start_fd on success + error */
203203
if (r < 0)
204-
return log_error_errno(errno, "Failed to dup connection to stdin: %m");
204+
return log_error_errno(errno, "Failed to move fd to stdin+stdout: %m");
205205

206-
r = dup2(start_fd, STDOUT_FILENO);
207-
if (r < 0)
208-
return log_error_errno(errno, "Failed to dup connection to stdout: %m");
209-
210-
start_fd = safe_close(start_fd);
211206
} else {
212207
if (start_fd != SD_LISTEN_FDS_START) {
213208
assert(n_fds == 1);

src/basic/exec-util.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,9 @@ static int do_spawn(const char *path, char *argv[], int stdout_fd, pid_t *pid) {
6262
char *_argv[2];
6363

6464
if (stdout_fd >= 0) {
65-
/* If the fd happens to be in the right place, go along with that */
66-
if (stdout_fd != STDOUT_FILENO &&
67-
dup2(stdout_fd, STDOUT_FILENO) < 0)
65+
r = rearrange_stdio(STDIN_FILENO, stdout_fd, STDERR_FILENO);
66+
if (r < 0)
6867
_exit(EXIT_FAILURE);
69-
70-
(void) fd_cloexec(STDOUT_FILENO, false);
7168
}
7269

7370
if (!argv) {

src/core/execute.c

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -765,15 +765,10 @@ static int setup_confirm_stdio(const char *vc, int *_saved_stdin, int *_saved_st
765765
if (r < 0)
766766
return r;
767767

768-
if (dup2(fd, STDIN_FILENO) < 0)
769-
return -errno;
770-
771-
if (dup2(fd, STDOUT_FILENO) < 0)
772-
return -errno;
773-
774-
if (fd >= 2)
775-
safe_close(fd);
768+
r = rearrange_stdio(fd, fd, STDERR_FILENO);
776769
fd = -1;
770+
if (r < 0)
771+
return r;
777772

778773
*_saved_stdin = saved_stdin;
779774
*_saved_stdout = saved_stdout;

src/import/import-common.c

Lines changed: 4 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,6 @@ int import_fork_tar_x(const char *path, pid_t *ret) {
8787
if (r < 0)
8888
return r;
8989
if (r == 0) {
90-
int null_fd;
9190
uint64_t retain =
9291
(1ULL << CAP_CHOWN) |
9392
(1ULL << CAP_FOWNER) |
@@ -100,26 +99,12 @@ int import_fork_tar_x(const char *path, pid_t *ret) {
10099

101100
pipefd[1] = safe_close(pipefd[1]);
102101

103-
r = move_fd(pipefd[0], STDIN_FILENO, false);
102+
r = rearrange_stdio(pipefd[0], -1, STDERR_FILENO);
104103
if (r < 0) {
105-
log_error_errno(r, "Failed to move fd: %m");
104+
log_error_errno(r, "Failed to rearrange stdin/stdout: %m");
106105
_exit(EXIT_FAILURE);
107106
}
108107

109-
null_fd = open("/dev/null", O_WRONLY|O_NOCTTY);
110-
if (null_fd < 0) {
111-
log_error_errno(errno, "Failed to open /dev/null: %m");
112-
_exit(EXIT_FAILURE);
113-
}
114-
115-
r = move_fd(null_fd, STDOUT_FILENO, false);
116-
if (r < 0) {
117-
log_error_errno(r, "Failed to move fd: %m");
118-
_exit(EXIT_FAILURE);
119-
}
120-
121-
stdio_unset_cloexec();
122-
123108
if (unshare(CLONE_NEWNET) < 0)
124109
log_error_errno(errno, "Failed to lock tar into network namespace, ignoring: %m");
125110

@@ -156,33 +141,18 @@ int import_fork_tar_c(const char *path, pid_t *ret) {
156141
if (r < 0)
157142
return r;
158143
if (r == 0) {
159-
int null_fd;
160144
uint64_t retain = (1ULL << CAP_DAC_OVERRIDE);
161145

162146
/* Child */
163147

164148
pipefd[0] = safe_close(pipefd[0]);
165149

166-
r = move_fd(pipefd[1], STDOUT_FILENO, false);
150+
r = rearrange_stdio(-1, pipefd[1], STDERR_FILENO);
167151
if (r < 0) {
168-
log_error_errno(r, "Failed to move fd: %m");
152+
log_error_errno(r, "Failed to rearrange stdin/stdout: %m");
169153
_exit(EXIT_FAILURE);
170154
}
171155

172-
null_fd = open("/dev/null", O_RDONLY|O_NOCTTY);
173-
if (null_fd < 0) {
174-
log_error_errno(errno, "Failed to open /dev/null: %m");
175-
_exit(EXIT_FAILURE);
176-
}
177-
178-
r = move_fd(null_fd, STDIN_FILENO, false);
179-
if (r < 0) {
180-
log_error_errno(errno, "Failed to move fd: %m");
181-
_exit(EXIT_FAILURE);
182-
}
183-
184-
stdio_unset_cloexec();
185-
186156
if (unshare(CLONE_NEWNET) < 0)
187157
log_error_errno(errno, "Failed to lock tar into network namespace, ignoring: %m");
188158

src/import/importd.c

Lines changed: 5 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -395,57 +395,14 @@ static int transfer_start(Transfer *t) {
395395

396396
pipefd[0] = safe_close(pipefd[0]);
397397

398-
if (dup2(pipefd[1], STDERR_FILENO) != STDERR_FILENO) {
399-
log_error_errno(errno, "Failed to dup2() fd: %m");
398+
r = rearrange_stdio(t->stdin_fd,
399+
t->stdout_fd < 0 ? pipefd[1] : t->stdout_fd,
400+
pipefd[1]);
401+
if (r < 0) {
402+
log_error_errno(r, "Failed to set stdin/stdout/stderr: %m");
400403
_exit(EXIT_FAILURE);
401404
}
402405

403-
if (t->stdout_fd >= 0) {
404-
if (dup2(t->stdout_fd, STDOUT_FILENO) != STDOUT_FILENO) {
405-
log_error_errno(errno, "Failed to dup2() fd: %m");
406-
_exit(EXIT_FAILURE);
407-
}
408-
409-
if (t->stdout_fd != STDOUT_FILENO)
410-
safe_close(t->stdout_fd);
411-
} else {
412-
if (dup2(pipefd[1], STDOUT_FILENO) != STDOUT_FILENO) {
413-
log_error_errno(errno, "Failed to dup2() fd: %m");
414-
_exit(EXIT_FAILURE);
415-
}
416-
}
417-
418-
if (!IN_SET(pipefd[1], STDOUT_FILENO, STDERR_FILENO))
419-
pipefd[1] = safe_close(pipefd[1]);
420-
421-
if (t->stdin_fd >= 0) {
422-
if (dup2(t->stdin_fd, STDIN_FILENO) != STDIN_FILENO) {
423-
log_error_errno(errno, "Failed to dup2() fd: %m");
424-
_exit(EXIT_FAILURE);
425-
}
426-
427-
if (t->stdin_fd != STDIN_FILENO)
428-
safe_close(t->stdin_fd);
429-
} else {
430-
int null_fd;
431-
432-
null_fd = open("/dev/null", O_RDONLY|O_NOCTTY);
433-
if (null_fd < 0) {
434-
log_error_errno(errno, "Failed to open /dev/null: %m");
435-
_exit(EXIT_FAILURE);
436-
}
437-
438-
if (dup2(null_fd, STDIN_FILENO) != STDIN_FILENO) {
439-
log_error_errno(errno, "Failed to dup2() fd: %m");
440-
_exit(EXIT_FAILURE);
441-
}
442-
443-
if (null_fd != STDIN_FILENO)
444-
safe_close(null_fd);
445-
}
446-
447-
stdio_unset_cloexec();
448-
449406
if (setenv("SYSTEMD_LOG_TARGET", "console-prefixed", 1) < 0 ||
450407
setenv("NOTIFY_SOCKET", "/run/systemd/import/notify", 1) < 0) {
451408
log_error_errno(errno, "setenv() failed: %m");

src/import/pull-common.c

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -483,27 +483,14 @@ int pull_verify(PullJob *main_job,
483483
NULL /* trailing NULL */
484484
};
485485
unsigned k = ELEMENTSOF(cmd) - 6;
486-
int null_fd;
487486

488487
/* Child */
489488

490489
gpg_pipe[1] = safe_close(gpg_pipe[1]);
491490

492-
r = move_fd(gpg_pipe[0], STDIN_FILENO, false);
491+
r = rearrange_stdio(gpg_pipe[0], -1, STDERR_FILENO);
493492
if (r < 0) {
494-
log_error_errno(errno, "Failed to move fd: %m");
495-
_exit(EXIT_FAILURE);
496-
}
497-
498-
null_fd = open("/dev/null", O_WRONLY|O_NOCTTY);
499-
if (null_fd < 0) {
500-
log_error_errno(errno, "Failed to open /dev/null: %m");
501-
_exit(EXIT_FAILURE);
502-
}
503-
504-
r = move_fd(null_fd, STDOUT_FILENO, false);
505-
if (r < 0) {
506-
log_error_errno(errno, "Failed to move fd: %m");
493+
log_error_errno(r, "Failed to rearrange stdin/stdout: %m");
507494
_exit(EXIT_FAILURE);
508495
}
509496

@@ -524,8 +511,6 @@ int pull_verify(PullJob *main_job,
524511
cmd[k++] = NULL;
525512
}
526513

527-
stdio_unset_cloexec();
528-
529514
execvp("gpg2", (char * const *) cmd);
530515
execvp("gpg", (char * const *) cmd);
531516
log_error_errno(errno, "Failed to execute gpg: %m");

src/journal-remote/journal-remote.c

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -96,23 +96,20 @@ static int spawn_child(const char* child, char** argv) {
9696

9797
/* In the child */
9898
if (r == 0) {
99+
safe_close(fd[0]);
99100

100-
r = dup2(fd[1], STDOUT_FILENO);
101+
r = rearrange_stdio(STDIN_FILENO, fd[1], STDERR_FILENO);
101102
if (r < 0) {
102-
log_error_errno(errno, "Failed to dup pipe to stdout: %m");
103+
log_error_errno(r, "Failed to dup pipe to stdout: %m");
103104
_exit(EXIT_FAILURE);
104105
}
105106

106-
safe_close_pair(fd);
107-
108107
execvp(child, argv);
109108
log_error_errno(errno, "Failed to exec child %s: %m", child);
110109
_exit(EXIT_FAILURE);
111110
}
112111

113-
r = close(fd[1]);
114-
if (r < 0)
115-
log_warning_errno(errno, "Failed to close write end of pipe: %m");
112+
safe_close(fd[1]);
116113

117114
r = fd_nonblock(fd[0], true);
118115
if (r < 0)

src/journal/cat.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -135,14 +135,13 @@ int main(int argc, char *argv[]) {
135135

136136
saved_stderr = fcntl(STDERR_FILENO, F_DUPFD_CLOEXEC, 3);
137137

138-
if (dup3(fd, STDOUT_FILENO, 0) < 0 ||
139-
dup3(fd, STDERR_FILENO, 0) < 0) {
140-
r = log_error_errno(errno, "Failed to duplicate fd: %m");
138+
r = rearrange_stdio(STDIN_FILENO, fd, fd); /* Invalidates fd on succcess + error! */
139+
fd = -1;
140+
if (r < 0) {
141+
log_error_errno(r, "Failed to rearrange stdout/stderr: %m");
141142
goto finish;
142143
}
143144

144-
fd = safe_close_above_stdio(fd);
145-
146145
if (argc <= optind)
147146
(void) execl("/bin/cat", "/bin/cat", NULL);
148147
else

src/libsystemd/sd-bus/bus-socket.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -960,14 +960,11 @@ int bus_socket_exec(sd_bus *b) {
960960
if (r == 0) {
961961
/* Child */
962962

963-
assert_se(dup3(s[1], STDIN_FILENO, 0) == STDIN_FILENO);
964-
assert_se(dup3(s[1], STDOUT_FILENO, 0) == STDOUT_FILENO);
963+
safe_close(s[0]);
965964

966-
if (!IN_SET(s[1], STDIN_FILENO, STDOUT_FILENO))
967-
safe_close(s[1]);
965+
if (rearrange_stdio(s[1], s[1], STDERR_FILENO) < 0)
966+
_exit(EXIT_FAILURE);
968967

969-
(void) fd_cloexec(STDIN_FILENO, false);
970-
(void) fd_cloexec(STDOUT_FILENO, false);
971968
(void) fd_nonblock(STDIN_FILENO, false);
972969
(void) fd_nonblock(STDOUT_FILENO, false);
973970

src/nspawn/nspawn-setuid.c

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -54,26 +54,12 @@ static int spawn_getent(const char *database, const char *key, pid_t *rpid) {
5454
}
5555
if (r == 0) {
5656
char *empty_env = NULL;
57-
int nullfd;
5857

59-
if (dup3(pipe_fds[1], STDOUT_FILENO, 0) < 0)
60-
_exit(EXIT_FAILURE);
61-
62-
safe_close_above_stdio(pipe_fds[0]);
63-
safe_close_above_stdio(pipe_fds[1]);
64-
65-
nullfd = open("/dev/null", O_RDWR);
66-
if (nullfd < 0)
67-
_exit(EXIT_FAILURE);
58+
safe_close(pipe_fds[0]);
6859

69-
if (dup3(nullfd, STDIN_FILENO, 0) < 0)
60+
if (rearrange_stdio(-1, pipe_fds[1], -1) < 0)
7061
_exit(EXIT_FAILURE);
7162

72-
if (dup3(nullfd, STDERR_FILENO, 0) < 0)
73-
_exit(EXIT_FAILURE);
74-
75-
safe_close_above_stdio(nullfd);
76-
7763
close_all_fds(NULL, 0);
7864

7965
execle("/usr/bin/getent", "getent", database, key, NULL, &empty_env);

0 commit comments

Comments
 (0)