Issue #12607: In subprocess, fix issue where if stdin, stdout or stderr is
given as a low fd, it gets overwritten.
diff --git a/Lib/subprocess.py b/Lib/subprocess.py
index ddbca6a..2d85b50 100644
--- a/Lib/subprocess.py
+++ b/Lib/subprocess.py
@@ -1219,6 +1219,14 @@
                                     os.close(errread)
                                 os.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:
+                                    c2pwrite = os.dup(c2pwrite)
+                                if errwrite == 0 or errwrite == 1:
+                                    errwrite = os.dup(errwrite)
+
                                 # Dup fds for child
                                 def _dup2(a, b):
                                     # dup2() removes the CLOEXEC flag but