blob: 452d592f15042032fbb17e72b994222c80eafb42 [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
267 fd_dir_fd = _Py_open(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{
Gregory P. Smith5591b022012-10-10 03:34:47 -0700395 int i, saved_errno, unused, 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
509 * less than PIPEBUF and we cannot do anything about an error anyways. */
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000510 if (saved_errno) {
511 char *cur;
Gregory P. Smith12fdca52012-01-21 12:31:25 -0800512 unused = write(errpipe_write, "OSError:", 8);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000513 cur = hex_errno + sizeof(hex_errno);
514 while (saved_errno != 0 && cur > hex_errno) {
515 *--cur = "0123456789ABCDEF"[saved_errno % 16];
516 saved_errno /= 16;
517 }
Gregory P. Smith12fdca52012-01-21 12:31:25 -0800518 unused = write(errpipe_write, cur, hex_errno + sizeof(hex_errno) - cur);
519 unused = write(errpipe_write, ":", 1);
Gregory P. Smith5591b022012-10-10 03:34:47 -0700520 if (!reached_preexec) {
521 /* Indicate to the parent that the error happened before exec(). */
522 unused = write(errpipe_write, "noexec", 6);
523 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000524 /* We can't call strerror(saved_errno). It is not async signal safe.
525 * The parent process will look the error message up. */
526 } else {
Gregory P. Smith8d07c262012-11-10 23:53:47 -0800527 unused = write(errpipe_write, "SubprocessError:0:", 18);
Gregory P. Smith12fdca52012-01-21 12:31:25 -0800528 unused = write(errpipe_write, err_msg, strlen(err_msg));
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000529 }
Gregory P. Smith12fdca52012-01-21 12:31:25 -0800530 if (unused) return; /* silly? yes! avoids gcc compiler warning. */
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000531}
532
533
534static PyObject *
535subprocess_fork_exec(PyObject* self, PyObject *args)
536{
537 PyObject *gc_module = NULL;
Antoine Pitrou721738f2012-08-15 23:20:39 +0200538 PyObject *executable_list, *py_fds_to_keep;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000539 PyObject *env_list, *preexec_fn;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000540 PyObject *process_args, *converted_args = NULL, *fast_args = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000541 PyObject *preexec_fn_args_tuple = NULL;
542 int p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite;
543 int errpipe_read, errpipe_write, close_fds, restore_signals;
544 int call_setsid;
Victor Stinner0e59cc32010-04-16 23:49:32 +0000545 PyObject *cwd_obj, *cwd_obj2;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000546 const char *cwd;
547 pid_t pid;
548 int need_to_reenable_gc = 0;
549 char *const *exec_array, *const *argv = NULL, *const *envp = NULL;
Gregory P. Smith8facece2012-01-21 14:01:08 -0800550 Py_ssize_t arg_num;
Victor Stinner8f437aa2014-10-05 17:25:19 +0200551 int import_lock_held = 0;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000552
553 if (!PyArg_ParseTuple(
Antoine Pitrou721738f2012-08-15 23:20:39 +0200554 args, "OOpOOOiiiiiiiiiiO:fork_exec",
555 &process_args, &executable_list, &close_fds, &py_fds_to_keep,
Victor Stinner0e59cc32010-04-16 23:49:32 +0000556 &cwd_obj, &env_list,
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000557 &p2cread, &p2cwrite, &c2pread, &c2pwrite,
558 &errread, &errwrite, &errpipe_read, &errpipe_write,
559 &restore_signals, &call_setsid, &preexec_fn))
560 return NULL;
561
Gregory P. Smith361e30c2013-12-01 00:12:24 -0800562 if (close_fds && errpipe_write < 3) { /* precondition */
563 PyErr_SetString(PyExc_ValueError, "errpipe_write must be >= 3");
564 return NULL;
565 }
Gregory P. Smith8facece2012-01-21 14:01:08 -0800566 if (PySequence_Length(py_fds_to_keep) < 0) {
567 PyErr_SetString(PyExc_ValueError, "cannot get length of fds_to_keep");
568 return NULL;
569 }
570 if (_sanity_check_python_fd_sequence(py_fds_to_keep)) {
571 PyErr_SetString(PyExc_ValueError, "bad value(s) in fds_to_keep");
Gregory P. Smithd4cc7bf2010-12-04 11:22:11 +0000572 return NULL;
573 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000574
575 /* We need to call gc.disable() when we'll be calling preexec_fn */
576 if (preexec_fn != Py_None) {
577 PyObject *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200578 _Py_IDENTIFIER(isenabled);
579 _Py_IDENTIFIER(disable);
Victor Stinnerdaf45552013-08-28 00:53:59 +0200580
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000581 gc_module = PyImport_ImportModule("gc");
582 if (gc_module == NULL)
583 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200584 result = _PyObject_CallMethodId(gc_module, &PyId_isenabled, NULL);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000585 if (result == NULL) {
586 Py_DECREF(gc_module);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000587 return NULL;
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000588 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000589 need_to_reenable_gc = PyObject_IsTrue(result);
590 Py_DECREF(result);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000591 if (need_to_reenable_gc == -1) {
592 Py_DECREF(gc_module);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000593 return NULL;
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000594 }
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200595 result = _PyObject_CallMethodId(gc_module, &PyId_disable, NULL);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000596 if (result == NULL) {
597 Py_DECREF(gc_module);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000598 return NULL;
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000599 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000600 Py_DECREF(result);
601 }
602
603 exec_array = _PySequence_BytesToCharpArray(executable_list);
Victor Stinner8f437aa2014-10-05 17:25:19 +0200604 if (!exec_array)
605 goto cleanup;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000606
607 /* Convert args and env into appropriate arguments for exec() */
608 /* These conversions are done in the parent process to avoid allocating
609 or freeing memory in the child process. */
610 if (process_args != Py_None) {
Gregory P. Smith68f52172010-03-15 06:07:42 +0000611 Py_ssize_t num_args;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000612 /* Equivalent to: */
613 /* tuple(PyUnicode_FSConverter(arg) for arg in process_args) */
Gregory P. Smith68f52172010-03-15 06:07:42 +0000614 fast_args = PySequence_Fast(process_args, "argv must be a tuple");
Stefan Krahdb579d72012-08-20 14:36:47 +0200615 if (fast_args == NULL)
616 goto cleanup;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000617 num_args = PySequence_Fast_GET_SIZE(fast_args);
618 converted_args = PyTuple_New(num_args);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000619 if (converted_args == NULL)
620 goto cleanup;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000621 for (arg_num = 0; arg_num < num_args; ++arg_num) {
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000622 PyObject *borrowed_arg, *converted_arg;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000623 borrowed_arg = PySequence_Fast_GET_ITEM(fast_args, arg_num);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000624 if (PyUnicode_FSConverter(borrowed_arg, &converted_arg) == 0)
625 goto cleanup;
626 PyTuple_SET_ITEM(converted_args, arg_num, converted_arg);
627 }
628
629 argv = _PySequence_BytesToCharpArray(converted_args);
630 Py_CLEAR(converted_args);
Gregory P. Smith68f52172010-03-15 06:07:42 +0000631 Py_CLEAR(fast_args);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000632 if (!argv)
633 goto cleanup;
634 }
635
636 if (env_list != Py_None) {
637 envp = _PySequence_BytesToCharpArray(env_list);
638 if (!envp)
639 goto cleanup;
640 }
641
642 if (preexec_fn != Py_None) {
643 preexec_fn_args_tuple = PyTuple_New(0);
644 if (!preexec_fn_args_tuple)
645 goto cleanup;
Victor Stinner0e59cc32010-04-16 23:49:32 +0000646 _PyImport_AcquireLock();
Victor Stinner8f437aa2014-10-05 17:25:19 +0200647 import_lock_held = 1;
Victor Stinner0e59cc32010-04-16 23:49:32 +0000648 }
649
650 if (cwd_obj != Py_None) {
651 if (PyUnicode_FSConverter(cwd_obj, &cwd_obj2) == 0)
652 goto cleanup;
Victor Stinnerdcb24032010-04-22 12:08:36 +0000653 cwd = PyBytes_AsString(cwd_obj2);
Victor Stinner0e59cc32010-04-16 23:49:32 +0000654 } else {
655 cwd = NULL;
656 cwd_obj2 = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000657 }
658
659 pid = fork();
660 if (pid == 0) {
661 /* Child process */
Victor Stinner0e59cc32010-04-16 23:49:32 +0000662 /*
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000663 * Code from here to _exit() must only use async-signal-safe functions,
664 * listed at `man 7 signal` or
665 * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
666 */
667
668 if (preexec_fn != Py_None) {
669 /* We'll be calling back into Python later so we need to do this.
670 * This call may not be async-signal-safe but neither is calling
671 * back into Python. The user asked us to use hope as a strategy
672 * to avoid deadlock... */
673 PyOS_AfterFork();
674 }
675
676 child_exec(exec_array, argv, envp, cwd,
677 p2cread, p2cwrite, c2pread, c2pwrite,
678 errread, errwrite, errpipe_read, errpipe_write,
679 close_fds, restore_signals, call_setsid,
Gregory P. Smith8facece2012-01-21 14:01:08 -0800680 py_fds_to_keep, preexec_fn, preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000681 _exit(255);
682 return NULL; /* Dead code to avoid a potential compiler warning. */
683 }
Victor Stinner0e59cc32010-04-16 23:49:32 +0000684 Py_XDECREF(cwd_obj2);
685
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000686 if (pid == -1) {
687 /* Capture the errno exception before errno can be clobbered. */
688 PyErr_SetFromErrno(PyExc_OSError);
689 }
690 if (preexec_fn != Py_None &&
691 _PyImport_ReleaseLock() < 0 && !PyErr_Occurred()) {
692 PyErr_SetString(PyExc_RuntimeError,
693 "not holding the import lock");
694 }
Victor Stinner8f437aa2014-10-05 17:25:19 +0200695 import_lock_held = 0;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000696
697 /* Parent process */
698 if (envp)
699 _Py_FreeCharPArray(envp);
700 if (argv)
701 _Py_FreeCharPArray(argv);
702 _Py_FreeCharPArray(exec_array);
703
704 /* Reenable gc in the parent process (or if fork failed). */
705 if (need_to_reenable_gc && _enable_gc(gc_module)) {
706 Py_XDECREF(gc_module);
707 return NULL;
708 }
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000709 Py_XDECREF(preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000710 Py_XDECREF(gc_module);
711
712 if (pid == -1)
713 return NULL; /* fork() failed. Exception set earlier. */
714
715 return PyLong_FromPid(pid);
716
717cleanup:
Victor Stinner8f437aa2014-10-05 17:25:19 +0200718 if (import_lock_held)
719 _PyImport_ReleaseLock();
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000720 if (envp)
721 _Py_FreeCharPArray(envp);
722 if (argv)
723 _Py_FreeCharPArray(argv);
Victor Stinner8f437aa2014-10-05 17:25:19 +0200724 if (exec_array)
725 _Py_FreeCharPArray(exec_array);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000726 Py_XDECREF(converted_args);
Gregory P. Smith68f52172010-03-15 06:07:42 +0000727 Py_XDECREF(fast_args);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000728 Py_XDECREF(preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000729
730 /* Reenable gc if it was disabled. */
Victor Stinner8f437aa2014-10-05 17:25:19 +0200731 if (need_to_reenable_gc) {
732 PyObject *exctype, *val, *tb;
733 PyErr_Fetch(&exctype, &val, &tb);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000734 _enable_gc(gc_module);
Victor Stinner8f437aa2014-10-05 17:25:19 +0200735 PyErr_Restore(exctype, val, tb);
736 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000737 Py_XDECREF(gc_module);
738 return NULL;
739}
740
741
742PyDoc_STRVAR(subprocess_fork_exec_doc,
743"fork_exec(args, executable_list, close_fds, cwd, env,\n\
744 p2cread, p2cwrite, c2pread, c2pwrite,\n\
745 errread, errwrite, errpipe_read, errpipe_write,\n\
746 restore_signals, call_setsid, preexec_fn)\n\
747\n\
748Forks a child process, closes parent file descriptors as appropriate in the\n\
749child and dups the few that are needed before calling exec() in the child\n\
750process.\n\
751\n\
752The preexec_fn, if supplied, will be called immediately before exec.\n\
753WARNING: preexec_fn is NOT SAFE if your application uses threads.\n\
754 It may trigger infrequent, difficult to debug deadlocks.\n\
755\n\
756If an error occurs in the child process before the exec, it is\n\
757serialized and written to the errpipe_write fd per subprocess.py.\n\
758\n\
759Returns: the child process's PID.\n\
760\n\
761Raises: Only on an error in the parent process.\n\
762");
763
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000764/* module level code ********************************************************/
765
766PyDoc_STRVAR(module_doc,
767"A POSIX helper for the subprocess module.");
768
769
770static PyMethodDef module_methods[] = {
771 {"fork_exec", subprocess_fork_exec, METH_VARARGS, subprocess_fork_exec_doc},
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000772 {NULL, NULL} /* sentinel */
773};
774
775
776static struct PyModuleDef _posixsubprocessmodule = {
777 PyModuleDef_HEAD_INIT,
778 "_posixsubprocess",
779 module_doc,
780 -1, /* No memory is needed. */
781 module_methods,
782};
783
784PyMODINIT_FUNC
785PyInit__posixsubprocess(void)
786{
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000787 return PyModule_Create(&_posixsubprocessmodule);
788}