summaryrefslogtreecommitdiffstats
path: root/Modules/_posixsubprocess.c
diff options
context:
space:
mode:
authorRoss Lagerwall <rosslagerwall@gmail.com>2011-07-27 05:16:31 (GMT)
committerRoss Lagerwall <rosslagerwall@gmail.com>2011-07-27 05:16:31 (GMT)
commitd98646e43096053ee13f5a9a6af38f8c723b1aaf (patch)
tree270481c64f561bd75fae76b17c7a47bca207e5f1 /Modules/_posixsubprocess.c
parent45686b472bf1f9e5ce1ef6953c4b123d271b2dc7 (diff)
downloadcpython-d98646e43096053ee13f5a9a6af38f8c723b1aaf.zip
cpython-d98646e43096053ee13f5a9a6af38f8c723b1aaf.tar.gz
cpython-d98646e43096053ee13f5a9a6af38f8c723b1aaf.tar.bz2
Issue #12607: In subprocess, fix issue where if stdin, stdout or stderr is
given as a low fd, it gets overwritten.
Diffstat (limited to 'Modules/_posixsubprocess.c')
-rw-r--r--Modules/_posixsubprocess.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c
index bf10cbb..11b24a0 100644
--- a/Modules/_posixsubprocess.c
+++ b/Modules/_posixsubprocess.c
@@ -69,6 +69,13 @@ static void child_exec(char *const exec_array[],
}
POSIX_CALL(close(errpipe_read));
+ /* When duping fds, if there arises a situation where one of the fds is
+ either 0, 1 or 2, it is possible that it is overwritten (#12607). */
+ if (c2pwrite == 0)
+ POSIX_CALL(c2pwrite = dup(c2pwrite));
+ if (errwrite == 0 || errwrite == 1)
+ POSIX_CALL(errwrite = dup(errwrite));
+
/* Dup fds for child.
dup2() removes the CLOEXEC flag but we must do it ourselves if dup2()
would be a no-op (issue #10806). */