diff options
author | Laurent Bercot <ska-skaware@skarnet.org> | 2019-06-16 09:01:54 +0000 |
---|---|---|
committer | Laurent Bercot <ska-skaware@skarnet.org> | 2019-06-16 09:01:54 +0000 |
commit | da84f235ef985883c79066204ee838717aacd41a (patch) | |
tree | b7a8dd8931814b9ad9a02bf848020645c0146cc1 /src/libstddjb/child_spawn2.c | |
parent | dae816d196ca006cb0e820de1d468e551129f220 (diff) | |
download | skalibs-da84f235ef985883c79066204ee838717aacd41a.tar.xz |
child_spawn*: make sure posix_spawn() doesn't clobber pipes with dup2+close
Diffstat (limited to 'src/libstddjb/child_spawn2.c')
-rw-r--r-- | src/libstddjb/child_spawn2.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/src/libstddjb/child_spawn2.c b/src/libstddjb/child_spawn2.c index d69764d..4e7d0a5 100644 --- a/src/libstddjb/child_spawn2.c +++ b/src/libstddjb/child_spawn2.c @@ -56,14 +56,20 @@ pid_t child_spawn2 (char const *prog, char const *const *argv, char const *const } e = posix_spawn_file_actions_init(&actions) ; if (e) goto errattr ; - e = posix_spawn_file_actions_adddup2(&actions, p[1][0], fds[0]) ; - if (e) goto erractions ; - e = posix_spawn_file_actions_addclose(&actions, p[1][0]) ; - if (e) goto erractions ; - e = posix_spawn_file_actions_adddup2(&actions, p[0][1], fds[1]) ; - if (e) goto erractions ; - e = posix_spawn_file_actions_addclose(&actions, p[0][1]) ; - if (e) goto erractions ; + if (p[1][0] != fds[0]) + { + e = posix_spawn_file_actions_adddup2(&actions, p[1][0], fds[0]) ; + if (e) goto erractions ; + e = posix_spawn_file_actions_addclose(&actions, p[1][0]) ; + if (e) goto erractions ; + } + if (p[0][1] != fds[1]) + { + e = posix_spawn_file_actions_adddup2(&actions, p[0][1], fds[1]) ; + if (e) goto erractions ; + e = posix_spawn_file_actions_addclose(&actions, p[0][1]) ; + if (e) goto erractions ; + } { int haspath = !!getenv("PATH") ; if (!haspath && (setenv("PATH", SKALIBS_DEFAULTPATH, 0) < 0)) |