commit da84f235ef985883c79066204ee838717aacd41a
parent dae816d196ca006cb0e820de1d468e551129f220
Author: Laurent Bercot <ska-skaware@skarnet.org>
Date: Sun, 16 Jun 2019 09:01:54 +0000
child_spawn*: make sure posix_spawn() doesn't clobber pipes with dup2+close
Diffstat:
4 files changed, 37 insertions(+), 22 deletions(-)
diff --git a/src/libstddjb/child_spawn.c b/src/libstddjb/child_spawn.c
@@ -77,14 +77,14 @@ pid_t child_spawn (char const *prog, char const *const *argv, char const *const
}
e = posix_spawn_file_actions_init(&actions) ;
if (e) goto errattr ;
- if (n >= 2)
+ if (n >= 2 && p[1][0])
{
e = posix_spawn_file_actions_adddup2(&actions, p[1][0], 0) ;
if (e) goto erractions ;
e = posix_spawn_file_actions_addclose(&actions, p[1][0]) ;
if (e) goto erractions ;
}
- if (n)
+ if (n && p[0][1] != 1)
{
e = posix_spawn_file_actions_adddup2(&actions, p[0][1], 1) ;
if (e) goto erractions ;
diff --git a/src/libstddjb/child_spawn1_internal.c b/src/libstddjb/child_spawn1_internal.c
@@ -32,10 +32,13 @@ pid_t child_spawn1_internal (char const *prog, char const *const *argv, char con
}
e = posix_spawn_file_actions_init(&actions) ;
if (e) goto errattr ;
- e = posix_spawn_file_actions_adddup2(&actions, p[to & 1], to & 1) ;
- if (e) goto erractions ;
- e = posix_spawn_file_actions_addclose(&actions, p[to & 1]) ;
- if (e) goto erractions ;
+ if (p[to & 1] != to & 1)
+ {
+ e = posix_spawn_file_actions_adddup2(&actions, p[to & 1], to & 1) ;
+ if (e) goto erractions ;
+ e = posix_spawn_file_actions_addclose(&actions, p[to & 1]) ;
+ if (e) goto erractions ;
+ }
if (to & 2)
{
e = posix_spawn_file_actions_adddup2(&actions, to & 1, !(to & 1)) ;
diff --git 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))
diff --git a/src/libstddjb/child_spawn3.c b/src/libstddjb/child_spawn3.c
@@ -62,14 +62,20 @@ pid_t child_spawn3 (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") ;
size_t envlen = env_len(envp) ;