blob: 800b3019c8fd3822f1754e13d44c2e01bcd3b218 [file] [log] [blame]
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00001/* Authors: Gregory P. Smith & Jeffrey Yasskin */
2#include "Python.h"
Victor Stinner5572ba72011-05-26 14:10:08 +02003#if defined(HAVE_PIPE2) && !defined(_GNU_SOURCE)
4# define _GNU_SOURCE
Gregory P. Smith51ee2702010-12-13 07:59:39 +00005#endif
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +00006#include <unistd.h>
Gregory P. Smith51ee2702010-12-13 07:59:39 +00007#include <fcntl.h>
Gregory P. Smith8facece2012-01-21 14:01:08 -08008#ifdef HAVE_SYS_TYPES_H
9#include <sys/types.h>
10#endif
Gregory P. Smith4842efc2012-01-21 21:01:24 -080011#if defined(HAVE_SYS_STAT_H) && defined(__FreeBSD__)
12#include <sys/stat.h>
13#endif
Gregory P. Smith8facece2012-01-21 14:01:08 -080014#ifdef HAVE_SYS_SYSCALL_H
15#include <sys/syscall.h>
16#endif
Gregory P. Smithf9681772015-04-25 23:43:34 -070017#if defined(HAVE_SYS_RESOURCE_H)
18#include <sys/resource.h>
19#endif
Gregory P. Smith8facece2012-01-21 14:01:08 -080020#ifdef HAVE_DIRENT_H
21#include <dirent.h>
22#endif
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +000023
Gregory P. Smithefeb9da2014-04-14 13:31:21 -070024#if defined(__ANDROID__) && !defined(SYS_getdents64)
25/* Android doesn't expose syscalls, add the definition manually. */
26# include <sys/linux-syscalls.h>
27# define SYS_getdents64 __NR_getdents64
28#endif
29
Gregory P. Smithe3f78482012-01-21 15:16:17 -080030#if defined(sun)
31/* readdir64 is used to work around Solaris 9 bug 6395699. */
32# define readdir readdir64
33# define dirent dirent64
34# if !defined(HAVE_DIRFD)
Gregory P. Smith8facece2012-01-21 14:01:08 -080035/* Some versions of Solaris lack dirfd(). */
Gregory P. Smithe9b7cab2012-01-21 15:19:11 -080036# define dirfd(dirp) ((dirp)->dd_fd)
Gregory P. Smithe3f78482012-01-21 15:16:17 -080037# define HAVE_DIRFD
Gregory P. Smithe3f78482012-01-21 15:16:17 -080038# endif
Gregory P. Smith8facece2012-01-21 14:01:08 -080039#endif
40
Gregory P. Smith4842efc2012-01-21 21:01:24 -080041#if defined(__FreeBSD__) || (defined(__APPLE__) && defined(__MACH__))
42# define FD_DIR "/dev/fd"
43#else
44# define FD_DIR "/proc/self/fd"
45#endif
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +000046
Victor Stinnerdaf45552013-08-28 00:53:59 +020047#define POSIX_CALL(call) do { if ((call) == -1) goto error; } while (0)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +000048
49
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +000050/* Given the gc module call gc.enable() and return 0 on success. */
Benjamin Peterson91eef982012-01-22 20:04:46 -050051static int
52_enable_gc(PyObject *gc_module)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +000053{
54 PyObject *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020055 _Py_IDENTIFIER(enable);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +020056
57 result = _PyObject_CallMethodId(gc_module, &PyId_enable, NULL);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +000058 if (result == NULL)
59 return 1;
60 Py_DECREF(result);
61 return 0;
62}
63
64
Gregory P. Smith8facece2012-01-21 14:01:08 -080065/* Convert ASCII to a positive int, no libc call. no overflow. -1 on error. */
Benjamin Peterson91eef982012-01-22 20:04:46 -050066static int
67_pos_int_from_ascii(char *name)
Gregory P. Smith8facece2012-01-21 14:01:08 -080068{
69 int num = 0;
70 while (*name >= '0' && *name <= '9') {
71 num = num * 10 + (*name - '0');
72 ++name;
73 }
74 if (*name)
75 return -1; /* Non digit found, not a number. */
76 return num;
77}
78
79
Gregory P. Smith4842efc2012-01-21 21:01:24 -080080#if defined(__FreeBSD__)
81/* When /dev/fd isn't mounted it is often a static directory populated
82 * with 0 1 2 or entries for 0 .. 63 on FreeBSD, NetBSD and OpenBSD.
83 * NetBSD and OpenBSD have a /proc fs available (though not necessarily
84 * mounted) and do not have fdescfs for /dev/fd. MacOS X has a devfs
85 * that properly supports /dev/fd.
86 */
Benjamin Peterson91eef982012-01-22 20:04:46 -050087static int
Ross Lagerwall7f4fdb22012-03-07 20:06:33 +020088_is_fdescfs_mounted_on_dev_fd(void)
Gregory P. Smith4842efc2012-01-21 21:01:24 -080089{
90 struct stat dev_stat;
91 struct stat dev_fd_stat;
92 if (stat("/dev", &dev_stat) != 0)
93 return 0;
94 if (stat(FD_DIR, &dev_fd_stat) != 0)
Victor Stinnerdaf45552013-08-28 00:53:59 +020095 return 0;
Gregory P. Smith4842efc2012-01-21 21:01:24 -080096 if (dev_stat.st_dev == dev_fd_stat.st_dev)
97 return 0; /* / == /dev == /dev/fd means it is static. #fail */
98 return 1;
99}
100#endif
101
102
Gregory P. Smith8facece2012-01-21 14:01:08 -0800103/* Returns 1 if there is a problem with fd_sequence, 0 otherwise. */
Benjamin Peterson91eef982012-01-22 20:04:46 -0500104static int
105_sanity_check_python_fd_sequence(PyObject *fd_sequence)
Gregory P. Smith8facece2012-01-21 14:01:08 -0800106{
107 Py_ssize_t seq_idx, seq_len = PySequence_Length(fd_sequence);
108 long prev_fd = -1;
109 for (seq_idx = 0; seq_idx < seq_len; ++seq_idx) {
110 PyObject* py_fd = PySequence_Fast_GET_ITEM(fd_sequence, seq_idx);
111 long iter_fd = PyLong_AsLong(py_fd);
112 if (iter_fd < 0 || iter_fd < prev_fd || iter_fd > INT_MAX) {
113 /* Negative, overflow, not a Long, unsorted, too big for a fd. */
114 return 1;
115 }
116 }
117 return 0;
118}
119
120
121/* Is fd found in the sorted Python Sequence? */
Benjamin Peterson91eef982012-01-22 20:04:46 -0500122static int
123_is_fd_in_sorted_fd_sequence(int fd, PyObject *fd_sequence)
Gregory P. Smith8facece2012-01-21 14:01:08 -0800124{
125 /* Binary search. */
126 Py_ssize_t search_min = 0;
127 Py_ssize_t search_max = PySequence_Length(fd_sequence) - 1;
128 if (search_max < 0)
129 return 0;
130 do {
131 long middle = (search_min + search_max) / 2;
132 long middle_fd = PyLong_AsLong(
133 PySequence_Fast_GET_ITEM(fd_sequence, middle));
134 if (fd == middle_fd)
135 return 1;
136 if (fd > middle_fd)
137 search_min = middle + 1;
138 else
139 search_max = middle - 1;
140 } while (search_min <= search_max);
141 return 0;
142}
143
Victor Stinnerdaf45552013-08-28 00:53:59 +0200144static int
145make_inheritable(PyObject *py_fds_to_keep, int errpipe_write)
146{
147 Py_ssize_t i, len;
148
149 len = PySequence_Length(py_fds_to_keep);
150 for (i = 0; i < len; ++i) {
151 PyObject* fdobj = PySequence_Fast_GET_ITEM(py_fds_to_keep, i);
152 long fd = PyLong_AsLong(fdobj);
153 assert(!PyErr_Occurred());
154 assert(0 <= fd && fd <= INT_MAX);
155 if (fd == errpipe_write) {
156 /* errpipe_write is part of py_fds_to_keep. It must be closed at
157 exec(), but kept open in the child process until exec() is
158 called. */
159 continue;
160 }
161 if (_Py_set_inheritable((int)fd, 1, NULL) < 0)
162 return -1;
163 }
164 return 0;
165}
166
Gregory P. Smith8facece2012-01-21 14:01:08 -0800167
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700168/* Get the maximum file descriptor that could be opened by this process.
169 * This function is async signal safe for use between fork() and exec().
170 */
171static long
172safe_get_max_fd(void)
173{
174 long local_max_fd;
175#if defined(__NetBSD__)
176 local_max_fd = fcntl(0, F_MAXFD);
177 if (local_max_fd >= 0)
178 return local_max_fd;
179#endif
Gregory P. Smithf9681772015-04-25 23:43:34 -0700180#if defined(HAVE_SYS_RESOURCE_H) && defined(__OpenBSD__)
181 struct rlimit rl;
182 /* Not on the POSIX async signal safe functions list but likely
183 * safe. TODO - Someone should audit OpenBSD to make sure. */
184 if (getrlimit(RLIMIT_NOFILE, &rl) >= 0)
185 return (long) rl.rlim_max;
186#endif
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700187#ifdef _SC_OPEN_MAX
188 local_max_fd = sysconf(_SC_OPEN_MAX);
189 if (local_max_fd == -1)
190#endif
191 local_max_fd = 256; /* Matches legacy Lib/subprocess.py behavior. */
192 return local_max_fd;
193}
194
195
196/* Close all file descriptors in the range from start_fd and higher
197 * except for those in py_fds_to_keep. If the range defined by
198 * [start_fd, safe_get_max_fd()) is large this will take a long
199 * time as it calls close() on EVERY possible fd.
200 *
201 * It isn't possible to know for sure what the max fd to go up to
202 * is for processes with the capability of raising their maximum.
Gregory P. Smith8facece2012-01-21 14:01:08 -0800203 */
Benjamin Peterson91eef982012-01-22 20:04:46 -0500204static void
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700205_close_fds_by_brute_force(long start_fd, PyObject *py_fds_to_keep)
Gregory P. Smith8facece2012-01-21 14:01:08 -0800206{
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700207 long end_fd = safe_get_max_fd();
Gregory P. Smith8facece2012-01-21 14:01:08 -0800208 Py_ssize_t num_fds_to_keep = PySequence_Length(py_fds_to_keep);
209 Py_ssize_t keep_seq_idx;
210 int fd_num;
211 /* As py_fds_to_keep is sorted we can loop through the list closing
212 * fds inbetween any in the keep list falling within our range. */
213 for (keep_seq_idx = 0; keep_seq_idx < num_fds_to_keep; ++keep_seq_idx) {
214 PyObject* py_keep_fd = PySequence_Fast_GET_ITEM(py_fds_to_keep,
215 keep_seq_idx);
216 int keep_fd = PyLong_AsLong(py_keep_fd);
217 if (keep_fd < start_fd)
218 continue;
219 for (fd_num = start_fd; fd_num < keep_fd; ++fd_num) {
Victor Stinnere7c74922015-04-02 16:24:46 +0200220 close(fd_num);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800221 }
222 start_fd = keep_fd + 1;
223 }
224 if (start_fd <= end_fd) {
225 for (fd_num = start_fd; fd_num < end_fd; ++fd_num) {
Victor Stinnere7c74922015-04-02 16:24:46 +0200226 close(fd_num);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800227 }
228 }
229}
230
231
232#if defined(__linux__) && defined(HAVE_SYS_SYSCALL_H)
233/* It doesn't matter if d_name has room for NAME_MAX chars; we're using this
234 * only to read a directory of short file descriptor number names. The kernel
235 * will return an error if we didn't give it enough space. Highly Unlikely.
236 * This structure is very old and stable: It will not change unless the kernel
237 * chooses to break compatibility with all existing binaries. Highly Unlikely.
238 */
Gregory P. Smith255bf5b2013-03-03 10:45:05 -0800239struct linux_dirent64 {
Gregory P. Smith58f07a92012-06-05 13:26:39 -0700240 unsigned long long d_ino;
Gregory P. Smith255bf5b2013-03-03 10:45:05 -0800241 long long d_off;
Gregory P. Smith8facece2012-01-21 14:01:08 -0800242 unsigned short d_reclen; /* Length of this linux_dirent */
Gregory P. Smith255bf5b2013-03-03 10:45:05 -0800243 unsigned char d_type;
Gregory P. Smith8facece2012-01-21 14:01:08 -0800244 char d_name[256]; /* Filename (null-terminated) */
245};
246
Gregory P. Smitha26987a2014-06-01 13:46:36 -0700247/* Close all open file descriptors in the range from start_fd and higher
248 * Do not close any in the sorted py_fds_to_keep list.
Gregory P. Smith8facece2012-01-21 14:01:08 -0800249 *
250 * This version is async signal safe as it does not make any unsafe C library
251 * calls, malloc calls or handle any locks. It is _unfortunate_ to be forced
252 * to resort to making a kernel system call directly but this is the ONLY api
253 * available that does no harm. opendir/readdir/closedir perform memory
254 * allocation and locking so while they usually work they are not guaranteed
255 * to (especially if you have replaced your malloc implementation). A version
256 * of this function that uses those can be found in the _maybe_unsafe variant.
257 *
258 * This is Linux specific because that is all I am ready to test it on. It
259 * should be easy to add OS specific dirent or dirent64 structures and modify
260 * it with some cpp #define magic to work on other OSes as well if you want.
261 */
Benjamin Peterson91eef982012-01-22 20:04:46 -0500262static void
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700263_close_open_fds_safe(int start_fd, PyObject* py_fds_to_keep)
Gregory P. Smith8facece2012-01-21 14:01:08 -0800264{
265 int fd_dir_fd;
Victor Stinnerdaf45552013-08-28 00:53:59 +0200266
Victor Stinner160e8192015-03-30 02:18:31 +0200267 fd_dir_fd = _Py_open_noraise(FD_DIR, O_RDONLY);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800268 if (fd_dir_fd == -1) {
269 /* No way to get a list of open fds. */
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700270 _close_fds_by_brute_force(start_fd, py_fds_to_keep);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800271 return;
272 } else {
Gregory P. Smith255bf5b2013-03-03 10:45:05 -0800273 char buffer[sizeof(struct linux_dirent64)];
Gregory P. Smith8facece2012-01-21 14:01:08 -0800274 int bytes;
Gregory P. Smith255bf5b2013-03-03 10:45:05 -0800275 while ((bytes = syscall(SYS_getdents64, fd_dir_fd,
276 (struct linux_dirent64 *)buffer,
Gregory P. Smith8facece2012-01-21 14:01:08 -0800277 sizeof(buffer))) > 0) {
Gregory P. Smith255bf5b2013-03-03 10:45:05 -0800278 struct linux_dirent64 *entry;
Gregory P. Smith8facece2012-01-21 14:01:08 -0800279 int offset;
280 for (offset = 0; offset < bytes; offset += entry->d_reclen) {
281 int fd;
Gregory P. Smith255bf5b2013-03-03 10:45:05 -0800282 entry = (struct linux_dirent64 *)(buffer + offset);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800283 if ((fd = _pos_int_from_ascii(entry->d_name)) < 0)
284 continue; /* Not a number. */
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700285 if (fd != fd_dir_fd && fd >= start_fd &&
Gregory P. Smith8facece2012-01-21 14:01:08 -0800286 !_is_fd_in_sorted_fd_sequence(fd, py_fds_to_keep)) {
Victor Stinnere7c74922015-04-02 16:24:46 +0200287 close(fd);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800288 }
289 }
290 }
Victor Stinnere7c74922015-04-02 16:24:46 +0200291 close(fd_dir_fd);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800292 }
293}
294
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700295#define _close_open_fds _close_open_fds_safe
Gregory P. Smith8facece2012-01-21 14:01:08 -0800296
297#else /* NOT (defined(__linux__) && defined(HAVE_SYS_SYSCALL_H)) */
298
299
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700300/* Close all open file descriptors from start_fd and higher.
301 * Do not close any in the sorted py_fds_to_keep list.
Gregory P. Smith8facece2012-01-21 14:01:08 -0800302 *
303 * This function violates the strict use of async signal safe functions. :(
Gregory P. Smithe3f78482012-01-21 15:16:17 -0800304 * It calls opendir(), readdir() and closedir(). Of these, the one most
Gregory P. Smith8facece2012-01-21 14:01:08 -0800305 * likely to ever cause a problem is opendir() as it performs an internal
306 * malloc(). Practically this should not be a problem. The Java VM makes the
307 * same calls between fork and exec in its own UNIXProcess_md.c implementation.
308 *
309 * readdir_r() is not used because it provides no benefit. It is typically
310 * implemented as readdir() followed by memcpy(). See also:
311 * http://womble.decadent.org.uk/readdir_r-advisory.html
312 */
Benjamin Peterson91eef982012-01-22 20:04:46 -0500313static void
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700314_close_open_fds_maybe_unsafe(long start_fd, PyObject* py_fds_to_keep)
Gregory P. Smith8facece2012-01-21 14:01:08 -0800315{
316 DIR *proc_fd_dir;
317#ifndef HAVE_DIRFD
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700318 while (_is_fd_in_sorted_fd_sequence(start_fd, py_fds_to_keep)) {
Gregory P. Smith8facece2012-01-21 14:01:08 -0800319 ++start_fd;
320 }
Gregory P. Smith8facece2012-01-21 14:01:08 -0800321 /* Close our lowest fd before we call opendir so that it is likely to
322 * reuse that fd otherwise we might close opendir's file descriptor in
323 * our loop. This trick assumes that fd's are allocated on a lowest
324 * available basis. */
Victor Stinnere7c74922015-04-02 16:24:46 +0200325 close(start_fd);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800326 ++start_fd;
327#endif
Gregory P. Smith8facece2012-01-21 14:01:08 -0800328
Gregory P. Smith4842efc2012-01-21 21:01:24 -0800329#if defined(__FreeBSD__)
330 if (!_is_fdescfs_mounted_on_dev_fd())
331 proc_fd_dir = NULL;
332 else
333#endif
334 proc_fd_dir = opendir(FD_DIR);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800335 if (!proc_fd_dir) {
336 /* No way to get a list of open fds. */
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700337 _close_fds_by_brute_force(start_fd, py_fds_to_keep);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800338 } else {
Gregory P. Smithe3f78482012-01-21 15:16:17 -0800339 struct dirent *dir_entry;
Gregory P. Smith8facece2012-01-21 14:01:08 -0800340#ifdef HAVE_DIRFD
Gregory P. Smithe9b7cab2012-01-21 15:19:11 -0800341 int fd_used_by_opendir = dirfd(proc_fd_dir);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800342#else
343 int fd_used_by_opendir = start_fd - 1;
344#endif
345 errno = 0;
Gregory P. Smithe3f78482012-01-21 15:16:17 -0800346 while ((dir_entry = readdir(proc_fd_dir))) {
Gregory P. Smith8facece2012-01-21 14:01:08 -0800347 int fd;
348 if ((fd = _pos_int_from_ascii(dir_entry->d_name)) < 0)
349 continue; /* Not a number. */
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700350 if (fd != fd_used_by_opendir && fd >= start_fd &&
Gregory P. Smith8facece2012-01-21 14:01:08 -0800351 !_is_fd_in_sorted_fd_sequence(fd, py_fds_to_keep)) {
Victor Stinnere7c74922015-04-02 16:24:46 +0200352 close(fd);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800353 }
354 errno = 0;
355 }
356 if (errno) {
357 /* readdir error, revert behavior. Highly Unlikely. */
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700358 _close_fds_by_brute_force(start_fd, py_fds_to_keep);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800359 }
360 closedir(proc_fd_dir);
361 }
362}
363
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700364#define _close_open_fds _close_open_fds_maybe_unsafe
Gregory P. Smith8facece2012-01-21 14:01:08 -0800365
366#endif /* else NOT (defined(__linux__) && defined(HAVE_SYS_SYSCALL_H)) */
367
368
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000369/*
370 * This function is code executed in the child process immediately after fork
371 * to set things up and call exec().
372 *
373 * All of the code in this function must only use async-signal-safe functions,
374 * listed at `man 7 signal` or
375 * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
376 *
377 * This restriction is documented at
378 * http://www.opengroup.org/onlinepubs/009695399/functions/fork.html.
379 */
Benjamin Peterson91eef982012-01-22 20:04:46 -0500380static void
381child_exec(char *const exec_array[],
382 char *const argv[],
383 char *const envp[],
384 const char *cwd,
385 int p2cread, int p2cwrite,
386 int c2pread, int c2pwrite,
387 int errread, int errwrite,
388 int errpipe_read, int errpipe_write,
389 int close_fds, int restore_signals,
390 int call_setsid,
391 PyObject *py_fds_to_keep,
392 PyObject *preexec_fn,
393 PyObject *preexec_fn_args_tuple)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000394{
Victor Stinner185fd332015-04-01 18:35:53 +0200395 int i, saved_errno, reached_preexec = 0;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000396 PyObject *result;
Gregory P. Smith14affb82010-12-22 05:22:17 +0000397 const char* err_msg = "";
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000398 /* Buffer large enough to hold a hex integer. We can't malloc. */
399 char hex_errno[sizeof(saved_errno)*2+1];
400
Victor Stinnerdaf45552013-08-28 00:53:59 +0200401 if (make_inheritable(py_fds_to_keep, errpipe_write) < 0)
402 goto error;
403
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000404 /* Close parent's pipe ends. */
Victor Stinnerdaf45552013-08-28 00:53:59 +0200405 if (p2cwrite != -1)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000406 POSIX_CALL(close(p2cwrite));
Victor Stinnerdaf45552013-08-28 00:53:59 +0200407 if (c2pread != -1)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000408 POSIX_CALL(close(c2pread));
Victor Stinnerdaf45552013-08-28 00:53:59 +0200409 if (errread != -1)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000410 POSIX_CALL(close(errread));
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000411 POSIX_CALL(close(errpipe_read));
412
Ross Lagerwalld98646e2011-07-27 07:16:31 +0200413 /* When duping fds, if there arises a situation where one of the fds is
414 either 0, 1 or 2, it is possible that it is overwritten (#12607). */
415 if (c2pwrite == 0)
416 POSIX_CALL(c2pwrite = dup(c2pwrite));
417 if (errwrite == 0 || errwrite == 1)
418 POSIX_CALL(errwrite = dup(errwrite));
419
Antoine Pitrouc9c83ba2011-01-03 18:23:55 +0000420 /* Dup fds for child.
421 dup2() removes the CLOEXEC flag but we must do it ourselves if dup2()
422 would be a no-op (issue #10806). */
423 if (p2cread == 0) {
Victor Stinnerdaf45552013-08-28 00:53:59 +0200424 if (_Py_set_inheritable(p2cread, 1, NULL) < 0)
425 goto error;
426 }
427 else if (p2cread != -1)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000428 POSIX_CALL(dup2(p2cread, 0)); /* stdin */
Victor Stinnerdaf45552013-08-28 00:53:59 +0200429
Antoine Pitrouc9c83ba2011-01-03 18:23:55 +0000430 if (c2pwrite == 1) {
Victor Stinnerdaf45552013-08-28 00:53:59 +0200431 if (_Py_set_inheritable(c2pwrite, 1, NULL) < 0)
432 goto error;
433 }
434 else if (c2pwrite != -1)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000435 POSIX_CALL(dup2(c2pwrite, 1)); /* stdout */
Victor Stinnerdaf45552013-08-28 00:53:59 +0200436
Antoine Pitrouc9c83ba2011-01-03 18:23:55 +0000437 if (errwrite == 2) {
Victor Stinnerdaf45552013-08-28 00:53:59 +0200438 if (_Py_set_inheritable(errwrite, 1, NULL) < 0)
439 goto error;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000440 }
Victor Stinnerdaf45552013-08-28 00:53:59 +0200441 else if (errwrite != -1)
442 POSIX_CALL(dup2(errwrite, 2)); /* stderr */
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000443
444 /* Close pipe fds. Make sure we don't close the same fd more than */
445 /* once, or standard fds. */
Victor Stinnerdaf45552013-08-28 00:53:59 +0200446 if (p2cread > 2)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000447 POSIX_CALL(close(p2cread));
Victor Stinnerdaf45552013-08-28 00:53:59 +0200448 if (c2pwrite > 2 && c2pwrite != p2cread)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000449 POSIX_CALL(close(c2pwrite));
Victor Stinnerdaf45552013-08-28 00:53:59 +0200450 if (errwrite != c2pwrite && errwrite != p2cread && errwrite > 2)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000451 POSIX_CALL(close(errwrite));
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000452
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000453 if (cwd)
454 POSIX_CALL(chdir(cwd));
455
456 if (restore_signals)
457 _Py_RestoreSignals();
458
459#ifdef HAVE_SETSID
460 if (call_setsid)
461 POSIX_CALL(setsid());
462#endif
463
Gregory P. Smith5591b022012-10-10 03:34:47 -0700464 reached_preexec = 1;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000465 if (preexec_fn != Py_None && preexec_fn_args_tuple) {
466 /* This is where the user has asked us to deadlock their program. */
467 result = PyObject_Call(preexec_fn, preexec_fn_args_tuple, NULL);
468 if (result == NULL) {
469 /* Stringifying the exception or traceback would involve
470 * memory allocation and thus potential for deadlock.
471 * We've already faced potential deadlock by calling back
472 * into Python in the first place, so it probably doesn't
473 * matter but we avoid it to minimize the possibility. */
474 err_msg = "Exception occurred in preexec_fn.";
475 errno = 0; /* We don't want to report an OSError. */
476 goto error;
477 }
478 /* Py_DECREF(result); - We're about to exec so why bother? */
479 }
480
Charles-François Natali249cdc32013-08-25 18:24:45 +0200481 /* close FDs after executing preexec_fn, which might open FDs */
482 if (close_fds) {
Charles-François Natali249cdc32013-08-25 18:24:45 +0200483 /* TODO HP-UX could use pstat_getproc() if anyone cares about it. */
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700484 _close_open_fds(3, py_fds_to_keep);
Charles-François Natali249cdc32013-08-25 18:24:45 +0200485 }
486
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000487 /* This loop matches the Lib/os.py _execvpe()'s PATH search when */
488 /* given the executable_list generated by Lib/subprocess.py. */
489 saved_errno = 0;
490 for (i = 0; exec_array[i] != NULL; ++i) {
491 const char *executable = exec_array[i];
492 if (envp) {
493 execve(executable, argv, envp);
494 } else {
495 execv(executable, argv);
496 }
497 if (errno != ENOENT && errno != ENOTDIR && saved_errno == 0) {
498 saved_errno = errno;
499 }
500 }
501 /* Report the first exec error, not the last. */
502 if (saved_errno)
503 errno = saved_errno;
504
505error:
506 saved_errno = errno;
507 /* Report the posix error to our parent process. */
Gregory P. Smith12fdca52012-01-21 12:31:25 -0800508 /* We ignore all write() return values as the total size of our writes is
Victor Stinner185fd332015-04-01 18:35:53 +0200509 less than PIPEBUF and we cannot do anything about an error anyways.
510 Use _Py_write_noraise() to retry write() if it is interrupted by a
511 signal (fails with EINTR). */
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000512 if (saved_errno) {
513 char *cur;
Victor Stinner185fd332015-04-01 18:35:53 +0200514 _Py_write_noraise(errpipe_write, "OSError:", 8);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000515 cur = hex_errno + sizeof(hex_errno);
516 while (saved_errno != 0 && cur > hex_errno) {
Gregory P. Smith4dff6f62015-04-25 23:42:38 +0000517 *--cur = Py_hexdigits[saved_errno % 16];
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000518 saved_errno /= 16;
519 }
Victor Stinner185fd332015-04-01 18:35:53 +0200520 _Py_write_noraise(errpipe_write, cur, hex_errno + sizeof(hex_errno) - cur);
521 _Py_write_noraise(errpipe_write, ":", 1);
Gregory P. Smith5591b022012-10-10 03:34:47 -0700522 if (!reached_preexec) {
523 /* Indicate to the parent that the error happened before exec(). */
Victor Stinner185fd332015-04-01 18:35:53 +0200524 _Py_write_noraise(errpipe_write, "noexec", 6);
Gregory P. Smith5591b022012-10-10 03:34:47 -0700525 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000526 /* We can't call strerror(saved_errno). It is not async signal safe.
527 * The parent process will look the error message up. */
528 } else {
Victor Stinner185fd332015-04-01 18:35:53 +0200529 _Py_write_noraise(errpipe_write, "SubprocessError:0:", 18);
530 _Py_write_noraise(errpipe_write, err_msg, strlen(err_msg));
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000531 }
532}
533
534
535static PyObject *
536subprocess_fork_exec(PyObject* self, PyObject *args)
537{
538 PyObject *gc_module = NULL;
Antoine Pitrou721738f2012-08-15 23:20:39 +0200539 PyObject *executable_list, *py_fds_to_keep;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000540 PyObject *env_list, *preexec_fn;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000541 PyObject *process_args, *converted_args = NULL, *fast_args = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000542 PyObject *preexec_fn_args_tuple = NULL;
543 int p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite;
544 int errpipe_read, errpipe_write, close_fds, restore_signals;
545 int call_setsid;
Victor Stinner0e59cc32010-04-16 23:49:32 +0000546 PyObject *cwd_obj, *cwd_obj2;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000547 const char *cwd;
548 pid_t pid;
549 int need_to_reenable_gc = 0;
550 char *const *exec_array, *const *argv = NULL, *const *envp = NULL;
Gregory P. Smith8facece2012-01-21 14:01:08 -0800551 Py_ssize_t arg_num;
Victor Stinnerbc5b80b2015-10-11 09:54:42 +0200552#ifdef WITH_THREAD
Victor Stinner8f437aa2014-10-05 17:25:19 +0200553 int import_lock_held = 0;
Victor Stinnerbc5b80b2015-10-11 09:54:42 +0200554#endif
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000555
556 if (!PyArg_ParseTuple(
Antoine Pitrou721738f2012-08-15 23:20:39 +0200557 args, "OOpOOOiiiiiiiiiiO:fork_exec",
558 &process_args, &executable_list, &close_fds, &py_fds_to_keep,
Victor Stinner0e59cc32010-04-16 23:49:32 +0000559 &cwd_obj, &env_list,
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000560 &p2cread, &p2cwrite, &c2pread, &c2pwrite,
561 &errread, &errwrite, &errpipe_read, &errpipe_write,
562 &restore_signals, &call_setsid, &preexec_fn))
563 return NULL;
564
Gregory P. Smith361e30c2013-12-01 00:12:24 -0800565 if (close_fds && errpipe_write < 3) { /* precondition */
566 PyErr_SetString(PyExc_ValueError, "errpipe_write must be >= 3");
567 return NULL;
568 }
Gregory P. Smith8facece2012-01-21 14:01:08 -0800569 if (PySequence_Length(py_fds_to_keep) < 0) {
570 PyErr_SetString(PyExc_ValueError, "cannot get length of fds_to_keep");
571 return NULL;
572 }
573 if (_sanity_check_python_fd_sequence(py_fds_to_keep)) {
574 PyErr_SetString(PyExc_ValueError, "bad value(s) in fds_to_keep");
Gregory P. Smithd4cc7bf2010-12-04 11:22:11 +0000575 return NULL;
576 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000577
578 /* We need to call gc.disable() when we'll be calling preexec_fn */
579 if (preexec_fn != Py_None) {
580 PyObject *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200581 _Py_IDENTIFIER(isenabled);
582 _Py_IDENTIFIER(disable);
Victor Stinnerdaf45552013-08-28 00:53:59 +0200583
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000584 gc_module = PyImport_ImportModule("gc");
585 if (gc_module == NULL)
586 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200587 result = _PyObject_CallMethodId(gc_module, &PyId_isenabled, NULL);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000588 if (result == NULL) {
589 Py_DECREF(gc_module);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000590 return NULL;
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000591 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000592 need_to_reenable_gc = PyObject_IsTrue(result);
593 Py_DECREF(result);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000594 if (need_to_reenable_gc == -1) {
595 Py_DECREF(gc_module);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000596 return NULL;
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000597 }
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200598 result = _PyObject_CallMethodId(gc_module, &PyId_disable, NULL);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000599 if (result == NULL) {
600 Py_DECREF(gc_module);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000601 return NULL;
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000602 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000603 Py_DECREF(result);
604 }
605
606 exec_array = _PySequence_BytesToCharpArray(executable_list);
Victor Stinner8f437aa2014-10-05 17:25:19 +0200607 if (!exec_array)
608 goto cleanup;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000609
610 /* Convert args and env into appropriate arguments for exec() */
611 /* These conversions are done in the parent process to avoid allocating
612 or freeing memory in the child process. */
613 if (process_args != Py_None) {
Gregory P. Smith68f52172010-03-15 06:07:42 +0000614 Py_ssize_t num_args;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000615 /* Equivalent to: */
616 /* tuple(PyUnicode_FSConverter(arg) for arg in process_args) */
Gregory P. Smith68f52172010-03-15 06:07:42 +0000617 fast_args = PySequence_Fast(process_args, "argv must be a tuple");
Stefan Krahdb579d72012-08-20 14:36:47 +0200618 if (fast_args == NULL)
619 goto cleanup;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000620 num_args = PySequence_Fast_GET_SIZE(fast_args);
621 converted_args = PyTuple_New(num_args);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000622 if (converted_args == NULL)
623 goto cleanup;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000624 for (arg_num = 0; arg_num < num_args; ++arg_num) {
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000625 PyObject *borrowed_arg, *converted_arg;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000626 borrowed_arg = PySequence_Fast_GET_ITEM(fast_args, arg_num);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000627 if (PyUnicode_FSConverter(borrowed_arg, &converted_arg) == 0)
628 goto cleanup;
629 PyTuple_SET_ITEM(converted_args, arg_num, converted_arg);
630 }
631
632 argv = _PySequence_BytesToCharpArray(converted_args);
633 Py_CLEAR(converted_args);
Gregory P. Smith68f52172010-03-15 06:07:42 +0000634 Py_CLEAR(fast_args);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000635 if (!argv)
636 goto cleanup;
637 }
638
639 if (env_list != Py_None) {
640 envp = _PySequence_BytesToCharpArray(env_list);
641 if (!envp)
642 goto cleanup;
643 }
644
645 if (preexec_fn != Py_None) {
646 preexec_fn_args_tuple = PyTuple_New(0);
647 if (!preexec_fn_args_tuple)
648 goto cleanup;
Victor Stinnerbc5b80b2015-10-11 09:54:42 +0200649#ifdef WITH_THREAD
Victor Stinner0e59cc32010-04-16 23:49:32 +0000650 _PyImport_AcquireLock();
Victor Stinner8f437aa2014-10-05 17:25:19 +0200651 import_lock_held = 1;
Victor Stinnerbc5b80b2015-10-11 09:54:42 +0200652#endif
Victor Stinner0e59cc32010-04-16 23:49:32 +0000653 }
654
655 if (cwd_obj != Py_None) {
656 if (PyUnicode_FSConverter(cwd_obj, &cwd_obj2) == 0)
657 goto cleanup;
Victor Stinnerdcb24032010-04-22 12:08:36 +0000658 cwd = PyBytes_AsString(cwd_obj2);
Victor Stinner0e59cc32010-04-16 23:49:32 +0000659 } else {
660 cwd = NULL;
661 cwd_obj2 = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000662 }
663
664 pid = fork();
665 if (pid == 0) {
666 /* Child process */
Victor Stinner0e59cc32010-04-16 23:49:32 +0000667 /*
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000668 * Code from here to _exit() must only use async-signal-safe functions,
669 * listed at `man 7 signal` or
670 * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
671 */
672
673 if (preexec_fn != Py_None) {
674 /* We'll be calling back into Python later so we need to do this.
675 * This call may not be async-signal-safe but neither is calling
676 * back into Python. The user asked us to use hope as a strategy
677 * to avoid deadlock... */
678 PyOS_AfterFork();
679 }
680
681 child_exec(exec_array, argv, envp, cwd,
682 p2cread, p2cwrite, c2pread, c2pwrite,
683 errread, errwrite, errpipe_read, errpipe_write,
684 close_fds, restore_signals, call_setsid,
Gregory P. Smith8facece2012-01-21 14:01:08 -0800685 py_fds_to_keep, preexec_fn, preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000686 _exit(255);
687 return NULL; /* Dead code to avoid a potential compiler warning. */
688 }
Victor Stinner0e59cc32010-04-16 23:49:32 +0000689 Py_XDECREF(cwd_obj2);
690
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000691 if (pid == -1) {
692 /* Capture the errno exception before errno can be clobbered. */
693 PyErr_SetFromErrno(PyExc_OSError);
694 }
Victor Stinnerbc5b80b2015-10-11 09:54:42 +0200695#ifdef WITH_THREAD
696 if (preexec_fn != Py_None
697 && _PyImport_ReleaseLock() < 0 && !PyErr_Occurred()) {
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000698 PyErr_SetString(PyExc_RuntimeError,
699 "not holding the import lock");
700 }
Victor Stinner8f437aa2014-10-05 17:25:19 +0200701 import_lock_held = 0;
Victor Stinnerbc5b80b2015-10-11 09:54:42 +0200702#endif
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000703
704 /* Parent process */
705 if (envp)
706 _Py_FreeCharPArray(envp);
707 if (argv)
708 _Py_FreeCharPArray(argv);
709 _Py_FreeCharPArray(exec_array);
710
711 /* Reenable gc in the parent process (or if fork failed). */
712 if (need_to_reenable_gc && _enable_gc(gc_module)) {
713 Py_XDECREF(gc_module);
714 return NULL;
715 }
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000716 Py_XDECREF(preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000717 Py_XDECREF(gc_module);
718
719 if (pid == -1)
720 return NULL; /* fork() failed. Exception set earlier. */
721
722 return PyLong_FromPid(pid);
723
724cleanup:
Victor Stinnerbc5b80b2015-10-11 09:54:42 +0200725#ifdef WITH_THREAD
Victor Stinner8f437aa2014-10-05 17:25:19 +0200726 if (import_lock_held)
727 _PyImport_ReleaseLock();
Victor Stinnerbc5b80b2015-10-11 09:54:42 +0200728#endif
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000729 if (envp)
730 _Py_FreeCharPArray(envp);
731 if (argv)
732 _Py_FreeCharPArray(argv);
Victor Stinner8f437aa2014-10-05 17:25:19 +0200733 if (exec_array)
734 _Py_FreeCharPArray(exec_array);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000735 Py_XDECREF(converted_args);
Gregory P. Smith68f52172010-03-15 06:07:42 +0000736 Py_XDECREF(fast_args);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000737 Py_XDECREF(preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000738
739 /* Reenable gc if it was disabled. */
Victor Stinner8f437aa2014-10-05 17:25:19 +0200740 if (need_to_reenable_gc) {
741 PyObject *exctype, *val, *tb;
742 PyErr_Fetch(&exctype, &val, &tb);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000743 _enable_gc(gc_module);
Victor Stinner8f437aa2014-10-05 17:25:19 +0200744 PyErr_Restore(exctype, val, tb);
745 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000746 Py_XDECREF(gc_module);
747 return NULL;
748}
749
750
751PyDoc_STRVAR(subprocess_fork_exec_doc,
752"fork_exec(args, executable_list, close_fds, cwd, env,\n\
753 p2cread, p2cwrite, c2pread, c2pwrite,\n\
754 errread, errwrite, errpipe_read, errpipe_write,\n\
755 restore_signals, call_setsid, preexec_fn)\n\
756\n\
757Forks a child process, closes parent file descriptors as appropriate in the\n\
758child and dups the few that are needed before calling exec() in the child\n\
759process.\n\
760\n\
761The preexec_fn, if supplied, will be called immediately before exec.\n\
762WARNING: preexec_fn is NOT SAFE if your application uses threads.\n\
763 It may trigger infrequent, difficult to debug deadlocks.\n\
764\n\
765If an error occurs in the child process before the exec, it is\n\
766serialized and written to the errpipe_write fd per subprocess.py.\n\
767\n\
768Returns: the child process's PID.\n\
769\n\
770Raises: Only on an error in the parent process.\n\
771");
772
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000773/* module level code ********************************************************/
774
775PyDoc_STRVAR(module_doc,
776"A POSIX helper for the subprocess module.");
777
778
779static PyMethodDef module_methods[] = {
780 {"fork_exec", subprocess_fork_exec, METH_VARARGS, subprocess_fork_exec_doc},
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000781 {NULL, NULL} /* sentinel */
782};
783
784
785static struct PyModuleDef _posixsubprocessmodule = {
786 PyModuleDef_HEAD_INIT,
787 "_posixsubprocess",
788 module_doc,
789 -1, /* No memory is needed. */
790 module_methods,
791};
792
793PyMODINIT_FUNC
794PyInit__posixsubprocess(void)
795{
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000796 return PyModule_Create(&_posixsubprocessmodule);
797}