diff options
author | Charles-François Natali <cf.natali@gmail.com> | 2013-08-25 16:24:45 (GMT) |
---|---|---|
committer | Charles-François Natali <cf.natali@gmail.com> | 2013-08-25 16:24:45 (GMT) |
commit | 249cdc39fcfb0405ccb2c952f5d8bfce77deb53d (patch) | |
tree | 7abb55a26b0ce6a800fdad7bfd4e94fab6da220f /Modules/_posixsubprocess.c | |
parent | ec8147ba5548bac5cefa41f98517e52528a6a0bd (diff) | |
download | cpython-249cdc39fcfb0405ccb2c952f5d8bfce77deb53d.zip cpython-249cdc39fcfb0405ccb2c952f5d8bfce77deb53d.tar.gz cpython-249cdc39fcfb0405ccb2c952f5d8bfce77deb53d.tar.bz2 |
Issue #18763: subprocess: The file descriptors are now closed after calling the
preexec_fn callback, which may open file descriptors.
Diffstat (limited to 'Modules/_posixsubprocess.c')
-rw-r--r-- | Modules/_posixsubprocess.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c index 07d7096..8d65530 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -412,17 +412,6 @@ child_exec(char *const exec_array[], POSIX_CALL(close(errwrite)); } - if (close_fds) { - int local_max_fd = max_fd; -#if defined(__NetBSD__) - local_max_fd = fcntl(0, F_MAXFD); - if (local_max_fd < 0) - local_max_fd = max_fd; -#endif - /* TODO HP-UX could use pstat_getproc() if anyone cares about it. */ - _close_open_fd_range(3, local_max_fd, py_fds_to_keep); - } - if (cwd) POSIX_CALL(chdir(cwd)); @@ -451,6 +440,18 @@ child_exec(char *const exec_array[], /* Py_DECREF(result); - We're about to exec so why bother? */ } + /* close FDs after executing preexec_fn, which might open FDs */ + if (close_fds) { + int local_max_fd = max_fd; +#if defined(__NetBSD__) + local_max_fd = fcntl(0, F_MAXFD); + if (local_max_fd < 0) + local_max_fd = max_fd; +#endif + /* TODO HP-UX could use pstat_getproc() if anyone cares about it. */ + _close_open_fd_range(3, local_max_fd, py_fds_to_keep); + } + /* This loop matches the Lib/os.py _execvpe()'s PATH search when */ /* given the executable_list generated by Lib/subprocess.py. */ saved_errno = 0; |