--- subprocess.py Thu Sep 13 18:01:09 2007 +++ subprocess.py.fix_fileno Mon Sep 17 09:56:43 2007 @@ -1015,20 +1015,33 @@ # Dup fds for child if p2cread is not None: + if c2pwrite == 0: + c2pwrite = os.dup(c2pwrite) + if errwrite == 0: + errwrite = os.dup(errwrite) os.dup2(p2cread, 0) if c2pwrite is not None: + if errwrite == 1: + errwrite = os.dup(errwrite) + if errpipe_write == 1: + errpipe_write = os.dup(errpipe_write) + self._set_cloexec_flag(errpipe_write) os.dup2(c2pwrite, 1) if errwrite is not None: + if errpipe_write == 2: + errpipe_write = os.dup(errpipe_write) + self._set_cloexec_flag(errpipe_write) os.dup2(errwrite, 2) # Close pipe fds. Make sure we don't close the same # fd more than once, or standard fds. - if p2cread is not None and p2cread not in (0,): - os.close(p2cread) - if c2pwrite is not None and c2pwrite not in (p2cread, 1): - os.close(c2pwrite) - if errwrite is not None and errwrite not in (p2cread, c2pwrite, 2): - os.close(errwrite) + dup_fds = { p2cread : None, + c2pwrite : None, + errwrite : None, + } + for fd in dup_fds: + if fd not in (0, 1, 2, None): + os.close(fd) # Close all other fds, if asked for if close_fds: