summaryrefslogtreecommitdiff
path: root/src/process/posix_spawn_file_actions_adddup2.c
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2013-02-03 16:42:40 -0500
committerRich Felker <dalias@aerifal.cx>2013-02-03 16:42:40 -0500
commitfb6b159d9ec7cf1e037daa974eeeacf3c8b3b3f1 (patch)
treeb2abcc807bf30691c9e65a59f463c77f0e46ff19 /src/process/posix_spawn_file_actions_adddup2.c
parent89d3df6e5420878e35a93a481105017a94a02852 (diff)
downloadmusl-fb6b159d9ec7cf1e037daa974eeeacf3c8b3b3f1.tar.gz
overhaul posix_spawn to use CLONE_VM instead of vfork
the proposed change was described in detail in detail previously on the mailing list. in short, vfork is unsafe because: 1. the compiler could make optimizations that cause the child to clobber the parent's local vars. 2. strace is buggy and allows the vforking parent to run before the child execs when run under strace. the new design uses a close-on-exec pipe instead of vfork semantics to synchronize the parent and child so that the parent does not return before the child has finished using its arguments (and now, also its stack). this also allows reporting exec failures to the caller instead of giving the caller a child that mysteriously exits with status 127 on exec error. basic testing has been performed on both the success and failure code paths. further testing should be done.
Diffstat (limited to 'src/process/posix_spawn_file_actions_adddup2.c')
-rw-r--r--src/process/posix_spawn_file_actions_adddup2.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/process/posix_spawn_file_actions_adddup2.c b/src/process/posix_spawn_file_actions_adddup2.c
index 26f2c5cc..0367498f 100644
--- a/src/process/posix_spawn_file_actions_adddup2.c
+++ b/src/process/posix_spawn_file_actions_adddup2.c
@@ -3,13 +3,13 @@
#include <errno.h>
#include "fdop.h"
-int posix_spawn_file_actions_adddup2(posix_spawn_file_actions_t *fa, int fd, int newfd)
+int posix_spawn_file_actions_adddup2(posix_spawn_file_actions_t *fa, int srcfd, int fd)
{
struct fdop *op = malloc(sizeof *op);
if (!op) return ENOMEM;
op->cmd = FDOP_DUP2;
+ op->srcfd = srcfd;
op->fd = fd;
- op->newfd = newfd;
if ((op->next = fa->__actions)) op->next->prev = op;
op->prev = 0;
fa->__actions = op;