drop O_CLOEXEC/O_NONBLOCK from files intended for forked clients
This commit is contained in:
parent
309bff19ed
commit
47a71eed0f
37
execute.c
37
execute.c
|
@ -105,6 +105,40 @@ static int shift_fds(int fds[], unsigned n_fds) {
|
||||||
return 0;
|
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) {
|
int exec_spawn(const ExecCommand *command, const ExecContext *context, int *fds, unsigned n_fds, pid_t *ret) {
|
||||||
pid_t pid;
|
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 ||
|
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;
|
r = EXIT_FDS;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue