summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2010-01-27 06:18:45 +0100
committerLennart Poettering <lennart@poettering.net>2010-01-27 06:18:45 +0100
commit47a71eed0f41c8661361d5506e47d1b223613680 (patch)
treea1798613362d20e2565decd3e1876a0dd69ce391
parent309bff19edec5e5a5f6c66ead3b0aa1eb55e7bc7 (diff)
drop O_CLOEXEC/O_NONBLOCK from files intended for forked clients
-rw-r--r--execute.c37
1 files changed, 36 insertions, 1 deletions
diff --git a/execute.c b/execute.c
index 6b1d4a1da1..1ca91fddd7 100644
--- a/execute.c
+++ b/execute.c
@@ -105,6 +105,40 @@ static int shift_fds(int fds[], unsigned n_fds) {
return 0;
}
+static int flags_fds(int fds[], unsigned n_fds) {
+ unsigned i;
+
+ if (n_fds <= 0)
+ return 0;
+
+ assert(fds);
+
+ /* Drops O_NONBLOCK and FD_CLOEXEC from the file flags */
+
+ for (i = 0; i < n_fds; i++) {
+ int flags;
+
+ if ((flags = fcntl(fds[i], F_GETFL, 0)) < 0)
+ return -errno;
+
+ /* Since we are at it, let's make sure that nobody
+ * forgot setting O_NONBLOCK for all our fds */
+
+ if (fcntl(fds[i], F_SETFL, flags &~O_NONBLOCK) < 0)
+ return -errno;
+
+ if ((flags = fcntl(fds[i], F_GETFD, 0)) < 0)
+ return -errno;
+
+ /* Also make sure nobody forgot O_CLOEXEC for all our
+ * fds */
+ if (fcntl(fds[i], F_SETFD, flags &~FD_CLOEXEC) < 0)
+ return -errno;
+ }
+
+ return 0;
+}
+
int exec_spawn(const ExecCommand *command, const ExecContext *context, int *fds, unsigned n_fds, pid_t *ret) {
pid_t pid;
@@ -153,7 +187,8 @@ int exec_spawn(const ExecCommand *command, const ExecContext *context, int *fds,
}
if (close_fds(fds, n_fds) < 0 ||
- shift_fds(fds, n_fds) < 0) {
+ shift_fds(fds, n_fds) < 0 ||
+ flags_fds(fds, n_fds) < 0) {
r = EXIT_FDS;
goto fail;
}