blob: f84cd26e8d9961e65bfe04521980ad5b8458e9c5 [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
17#ifdef HAVE_DIRENT_H
18#include <dirent.h>
19#endif
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +000020
Gregory P. Smithefeb9da2014-04-14 13:31:21 -070021#if defined(__ANDROID__) && !defined(SYS_getdents64)
22/* Android doesn't expose syscalls, add the definition manually. */
23# include <sys/linux-syscalls.h>
24# define SYS_getdents64 __NR_getdents64
25#endif
26
Gregory P. Smithe3f78482012-01-21 15:16:17 -080027#if defined(sun)
28/* readdir64 is used to work around Solaris 9 bug 6395699. */
29# define readdir readdir64
30# define dirent dirent64
31# if !defined(HAVE_DIRFD)
Gregory P. Smith8facece2012-01-21 14:01:08 -080032/* Some versions of Solaris lack dirfd(). */
Gregory P. Smithe9b7cab2012-01-21 15:19:11 -080033# define dirfd(dirp) ((dirp)->dd_fd)
Gregory P. Smithe3f78482012-01-21 15:16:17 -080034# define HAVE_DIRFD
Gregory P. Smithe3f78482012-01-21 15:16:17 -080035# endif
Gregory P. Smith8facece2012-01-21 14:01:08 -080036#endif
37
Gregory P. Smith4842efc2012-01-21 21:01:24 -080038#if defined(__FreeBSD__) || (defined(__APPLE__) && defined(__MACH__))
39# define FD_DIR "/dev/fd"
40#else
41# define FD_DIR "/proc/self/fd"
42#endif
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +000043
Victor Stinnerdaf45552013-08-28 00:53:59 +020044#define POSIX_CALL(call) do { if ((call) == -1) goto error; } while (0)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +000045
46
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +000047/* Given the gc module call gc.enable() and return 0 on success. */
Benjamin Peterson91eef982012-01-22 20:04:46 -050048static int
49_enable_gc(PyObject *gc_module)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +000050{
51 PyObject *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020052 _Py_IDENTIFIER(enable);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +020053
54 result = _PyObject_CallMethodId(gc_module, &PyId_enable, NULL);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +000055 if (result == NULL)
56 return 1;
57 Py_DECREF(result);
58 return 0;
59}
60
61
Gregory P. Smith8facece2012-01-21 14:01:08 -080062/* Convert ASCII to a positive int, no libc call. no overflow. -1 on error. */
Benjamin Peterson91eef982012-01-22 20:04:46 -050063static int
64_pos_int_from_ascii(char *name)
Gregory P. Smith8facece2012-01-21 14:01:08 -080065{
66 int num = 0;
67 while (*name >= '0' && *name <= '9') {
68 num = num * 10 + (*name - '0');
69 ++name;
70 }
71 if (*name)
72 return -1; /* Non digit found, not a number. */
73 return num;
74}
75
76
Gregory P. Smith4842efc2012-01-21 21:01:24 -080077#if defined(__FreeBSD__)
78/* When /dev/fd isn't mounted it is often a static directory populated
79 * with 0 1 2 or entries for 0 .. 63 on FreeBSD, NetBSD and OpenBSD.
80 * NetBSD and OpenBSD have a /proc fs available (though not necessarily
81 * mounted) and do not have fdescfs for /dev/fd. MacOS X has a devfs
82 * that properly supports /dev/fd.
83 */
Benjamin Peterson91eef982012-01-22 20:04:46 -050084static int
Ross Lagerwall7f4fdb22012-03-07 20:06:33 +020085_is_fdescfs_mounted_on_dev_fd(void)
Gregory P. Smith4842efc2012-01-21 21:01:24 -080086{
87 struct stat dev_stat;
88 struct stat dev_fd_stat;
89 if (stat("/dev", &dev_stat) != 0)
90 return 0;
91 if (stat(FD_DIR, &dev_fd_stat) != 0)
Victor Stinnerdaf45552013-08-28 00:53:59 +020092 return 0;
Gregory P. Smith4842efc2012-01-21 21:01:24 -080093 if (dev_stat.st_dev == dev_fd_stat.st_dev)
94 return 0; /* / == /dev == /dev/fd means it is static. #fail */
95 return 1;
96}
97#endif
98
99
Gregory P. Smith8facece2012-01-21 14:01:08 -0800100/* Returns 1 if there is a problem with fd_sequence, 0 otherwise. */
Benjamin Peterson91eef982012-01-22 20:04:46 -0500101static int
102_sanity_check_python_fd_sequence(PyObject *fd_sequence)
Gregory P. Smith8facece2012-01-21 14:01:08 -0800103{
104 Py_ssize_t seq_idx, seq_len = PySequence_Length(fd_sequence);
105 long prev_fd = -1;
106 for (seq_idx = 0; seq_idx < seq_len; ++seq_idx) {
107 PyObject* py_fd = PySequence_Fast_GET_ITEM(fd_sequence, seq_idx);
108 long iter_fd = PyLong_AsLong(py_fd);
109 if (iter_fd < 0 || iter_fd < prev_fd || iter_fd > INT_MAX) {
110 /* Negative, overflow, not a Long, unsorted, too big for a fd. */
111 return 1;
112 }
113 }
114 return 0;
115}
116
117
118/* Is fd found in the sorted Python Sequence? */
Benjamin Peterson91eef982012-01-22 20:04:46 -0500119static int
120_is_fd_in_sorted_fd_sequence(int fd, PyObject *fd_sequence)
Gregory P. Smith8facece2012-01-21 14:01:08 -0800121{
122 /* Binary search. */
123 Py_ssize_t search_min = 0;
124 Py_ssize_t search_max = PySequence_Length(fd_sequence) - 1;
125 if (search_max < 0)
126 return 0;
127 do {
128 long middle = (search_min + search_max) / 2;
129 long middle_fd = PyLong_AsLong(
130 PySequence_Fast_GET_ITEM(fd_sequence, middle));
131 if (fd == middle_fd)
132 return 1;
133 if (fd > middle_fd)
134 search_min = middle + 1;
135 else
136 search_max = middle - 1;
137 } while (search_min <= search_max);
138 return 0;
139}
140
Victor Stinnerdaf45552013-08-28 00:53:59 +0200141static int
142make_inheritable(PyObject *py_fds_to_keep, int errpipe_write)
143{
144 Py_ssize_t i, len;
145
146 len = PySequence_Length(py_fds_to_keep);
147 for (i = 0; i < len; ++i) {
148 PyObject* fdobj = PySequence_Fast_GET_ITEM(py_fds_to_keep, i);
149 long fd = PyLong_AsLong(fdobj);
150 assert(!PyErr_Occurred());
151 assert(0 <= fd && fd <= INT_MAX);
152 if (fd == errpipe_write) {
153 /* errpipe_write is part of py_fds_to_keep. It must be closed at
154 exec(), but kept open in the child process until exec() is
155 called. */
156 continue;
157 }
158 if (_Py_set_inheritable((int)fd, 1, NULL) < 0)
159 return -1;
160 }
161 return 0;
162}
163
Gregory P. Smith8facece2012-01-21 14:01:08 -0800164
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700165/* Get the maximum file descriptor that could be opened by this process.
166 * This function is async signal safe for use between fork() and exec().
167 */
168static long
169safe_get_max_fd(void)
170{
171 long local_max_fd;
172#if defined(__NetBSD__)
173 local_max_fd = fcntl(0, F_MAXFD);
174 if (local_max_fd >= 0)
175 return local_max_fd;
176#endif
177#ifdef _SC_OPEN_MAX
178 local_max_fd = sysconf(_SC_OPEN_MAX);
179 if (local_max_fd == -1)
180#endif
181 local_max_fd = 256; /* Matches legacy Lib/subprocess.py behavior. */
182 return local_max_fd;
183}
184
185
186/* Close all file descriptors in the range from start_fd and higher
187 * except for those in py_fds_to_keep. If the range defined by
188 * [start_fd, safe_get_max_fd()) is large this will take a long
189 * time as it calls close() on EVERY possible fd.
190 *
191 * It isn't possible to know for sure what the max fd to go up to
192 * is for processes with the capability of raising their maximum.
Gregory P. Smith8facece2012-01-21 14:01:08 -0800193 */
Benjamin Peterson91eef982012-01-22 20:04:46 -0500194static void
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700195_close_fds_by_brute_force(long start_fd, PyObject *py_fds_to_keep)
Gregory P. Smith8facece2012-01-21 14:01:08 -0800196{
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700197 long end_fd = safe_get_max_fd();
Gregory P. Smith8facece2012-01-21 14:01:08 -0800198 Py_ssize_t num_fds_to_keep = PySequence_Length(py_fds_to_keep);
199 Py_ssize_t keep_seq_idx;
200 int fd_num;
201 /* As py_fds_to_keep is sorted we can loop through the list closing
202 * fds inbetween any in the keep list falling within our range. */
203 for (keep_seq_idx = 0; keep_seq_idx < num_fds_to_keep; ++keep_seq_idx) {
204 PyObject* py_keep_fd = PySequence_Fast_GET_ITEM(py_fds_to_keep,
205 keep_seq_idx);
206 int keep_fd = PyLong_AsLong(py_keep_fd);
207 if (keep_fd < start_fd)
208 continue;
209 for (fd_num = start_fd; fd_num < keep_fd; ++fd_num) {
210 while (close(fd_num) < 0 && errno == EINTR);
211 }
212 start_fd = keep_fd + 1;
213 }
214 if (start_fd <= end_fd) {
215 for (fd_num = start_fd; fd_num < end_fd; ++fd_num) {
216 while (close(fd_num) < 0 && errno == EINTR);
217 }
218 }
219}
220
221
222#if defined(__linux__) && defined(HAVE_SYS_SYSCALL_H)
223/* It doesn't matter if d_name has room for NAME_MAX chars; we're using this
224 * only to read a directory of short file descriptor number names. The kernel
225 * will return an error if we didn't give it enough space. Highly Unlikely.
226 * This structure is very old and stable: It will not change unless the kernel
227 * chooses to break compatibility with all existing binaries. Highly Unlikely.
228 */
Gregory P. Smith255bf5b2013-03-03 10:45:05 -0800229struct linux_dirent64 {
Gregory P. Smith58f07a92012-06-05 13:26:39 -0700230 unsigned long long d_ino;
Gregory P. Smith255bf5b2013-03-03 10:45:05 -0800231 long long d_off;
Gregory P. Smith8facece2012-01-21 14:01:08 -0800232 unsigned short d_reclen; /* Length of this linux_dirent */
Gregory P. Smith255bf5b2013-03-03 10:45:05 -0800233 unsigned char d_type;
Gregory P. Smith8facece2012-01-21 14:01:08 -0800234 char d_name[256]; /* Filename (null-terminated) */
235};
236
Gregory P. Smitha26987a2014-06-01 13:46:36 -0700237/* Close all open file descriptors in the range from start_fd and higher
238 * Do not close any in the sorted py_fds_to_keep list.
Gregory P. Smith8facece2012-01-21 14:01:08 -0800239 *
240 * This version is async signal safe as it does not make any unsafe C library
241 * calls, malloc calls or handle any locks. It is _unfortunate_ to be forced
242 * to resort to making a kernel system call directly but this is the ONLY api
243 * available that does no harm. opendir/readdir/closedir perform memory
244 * allocation and locking so while they usually work they are not guaranteed
245 * to (especially if you have replaced your malloc implementation). A version
246 * of this function that uses those can be found in the _maybe_unsafe variant.
247 *
248 * This is Linux specific because that is all I am ready to test it on. It
249 * should be easy to add OS specific dirent or dirent64 structures and modify
250 * it with some cpp #define magic to work on other OSes as well if you want.
251 */
Benjamin Peterson91eef982012-01-22 20:04:46 -0500252static void
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700253_close_open_fds_safe(int start_fd, PyObject* py_fds_to_keep)
Gregory P. Smith8facece2012-01-21 14:01:08 -0800254{
255 int fd_dir_fd;
Victor Stinnerdaf45552013-08-28 00:53:59 +0200256
257 fd_dir_fd = _Py_open(FD_DIR, O_RDONLY);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800258 if (fd_dir_fd == -1) {
259 /* No way to get a list of open fds. */
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700260 _close_fds_by_brute_force(start_fd, py_fds_to_keep);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800261 return;
262 } else {
Gregory P. Smith255bf5b2013-03-03 10:45:05 -0800263 char buffer[sizeof(struct linux_dirent64)];
Gregory P. Smith8facece2012-01-21 14:01:08 -0800264 int bytes;
Gregory P. Smith255bf5b2013-03-03 10:45:05 -0800265 while ((bytes = syscall(SYS_getdents64, fd_dir_fd,
266 (struct linux_dirent64 *)buffer,
Gregory P. Smith8facece2012-01-21 14:01:08 -0800267 sizeof(buffer))) > 0) {
Gregory P. Smith255bf5b2013-03-03 10:45:05 -0800268 struct linux_dirent64 *entry;
Gregory P. Smith8facece2012-01-21 14:01:08 -0800269 int offset;
270 for (offset = 0; offset < bytes; offset += entry->d_reclen) {
271 int fd;
Gregory P. Smith255bf5b2013-03-03 10:45:05 -0800272 entry = (struct linux_dirent64 *)(buffer + offset);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800273 if ((fd = _pos_int_from_ascii(entry->d_name)) < 0)
274 continue; /* Not a number. */
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700275 if (fd != fd_dir_fd && fd >= start_fd &&
Gregory P. Smith8facece2012-01-21 14:01:08 -0800276 !_is_fd_in_sorted_fd_sequence(fd, py_fds_to_keep)) {
277 while (close(fd) < 0 && errno == EINTR);
278 }
279 }
280 }
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700281 while (close(fd_dir_fd) < 0 && errno == EINTR);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800282 }
283}
284
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700285#define _close_open_fds _close_open_fds_safe
Gregory P. Smith8facece2012-01-21 14:01:08 -0800286
287#else /* NOT (defined(__linux__) && defined(HAVE_SYS_SYSCALL_H)) */
288
289
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700290/* Close all open file descriptors from start_fd and higher.
291 * Do not close any in the sorted py_fds_to_keep list.
Gregory P. Smith8facece2012-01-21 14:01:08 -0800292 *
293 * This function violates the strict use of async signal safe functions. :(
Gregory P. Smithe3f78482012-01-21 15:16:17 -0800294 * It calls opendir(), readdir() and closedir(). Of these, the one most
Gregory P. Smith8facece2012-01-21 14:01:08 -0800295 * likely to ever cause a problem is opendir() as it performs an internal
296 * malloc(). Practically this should not be a problem. The Java VM makes the
297 * same calls between fork and exec in its own UNIXProcess_md.c implementation.
298 *
299 * readdir_r() is not used because it provides no benefit. It is typically
300 * implemented as readdir() followed by memcpy(). See also:
301 * http://womble.decadent.org.uk/readdir_r-advisory.html
302 */
Benjamin Peterson91eef982012-01-22 20:04:46 -0500303static void
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700304_close_open_fds_maybe_unsafe(long start_fd, PyObject* py_fds_to_keep)
Gregory P. Smith8facece2012-01-21 14:01:08 -0800305{
306 DIR *proc_fd_dir;
307#ifndef HAVE_DIRFD
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700308 while (_is_fd_in_sorted_fd_sequence(start_fd, py_fds_to_keep)) {
Gregory P. Smith8facece2012-01-21 14:01:08 -0800309 ++start_fd;
310 }
Gregory P. Smith8facece2012-01-21 14:01:08 -0800311 /* Close our lowest fd before we call opendir so that it is likely to
312 * reuse that fd otherwise we might close opendir's file descriptor in
313 * our loop. This trick assumes that fd's are allocated on a lowest
314 * available basis. */
315 while (close(start_fd) < 0 && errno == EINTR);
316 ++start_fd;
317#endif
Gregory P. Smith8facece2012-01-21 14:01:08 -0800318
Gregory P. Smith4842efc2012-01-21 21:01:24 -0800319#if defined(__FreeBSD__)
320 if (!_is_fdescfs_mounted_on_dev_fd())
321 proc_fd_dir = NULL;
322 else
323#endif
324 proc_fd_dir = opendir(FD_DIR);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800325 if (!proc_fd_dir) {
326 /* No way to get a list of open fds. */
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700327 _close_fds_by_brute_force(start_fd, py_fds_to_keep);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800328 } else {
Gregory P. Smithe3f78482012-01-21 15:16:17 -0800329 struct dirent *dir_entry;
Gregory P. Smith8facece2012-01-21 14:01:08 -0800330#ifdef HAVE_DIRFD
Gregory P. Smithe9b7cab2012-01-21 15:19:11 -0800331 int fd_used_by_opendir = dirfd(proc_fd_dir);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800332#else
333 int fd_used_by_opendir = start_fd - 1;
334#endif
335 errno = 0;
Gregory P. Smithe3f78482012-01-21 15:16:17 -0800336 while ((dir_entry = readdir(proc_fd_dir))) {
Gregory P. Smith8facece2012-01-21 14:01:08 -0800337 int fd;
338 if ((fd = _pos_int_from_ascii(dir_entry->d_name)) < 0)
339 continue; /* Not a number. */
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700340 if (fd != fd_used_by_opendir && fd >= start_fd &&
Gregory P. Smith8facece2012-01-21 14:01:08 -0800341 !_is_fd_in_sorted_fd_sequence(fd, py_fds_to_keep)) {
342 while (close(fd) < 0 && errno == EINTR);
343 }
344 errno = 0;
345 }
346 if (errno) {
347 /* readdir error, revert behavior. Highly Unlikely. */
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700348 _close_fds_by_brute_force(start_fd, py_fds_to_keep);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800349 }
350 closedir(proc_fd_dir);
351 }
352}
353
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700354#define _close_open_fds _close_open_fds_maybe_unsafe
Gregory P. Smith8facece2012-01-21 14:01:08 -0800355
356#endif /* else NOT (defined(__linux__) && defined(HAVE_SYS_SYSCALL_H)) */
357
358
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000359/*
360 * This function is code executed in the child process immediately after fork
361 * to set things up and call exec().
362 *
363 * All of the code in this function must only use async-signal-safe functions,
364 * listed at `man 7 signal` or
365 * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
366 *
367 * This restriction is documented at
368 * http://www.opengroup.org/onlinepubs/009695399/functions/fork.html.
369 */
Benjamin Peterson91eef982012-01-22 20:04:46 -0500370static void
371child_exec(char *const exec_array[],
372 char *const argv[],
373 char *const envp[],
374 const char *cwd,
375 int p2cread, int p2cwrite,
376 int c2pread, int c2pwrite,
377 int errread, int errwrite,
378 int errpipe_read, int errpipe_write,
379 int close_fds, int restore_signals,
380 int call_setsid,
381 PyObject *py_fds_to_keep,
382 PyObject *preexec_fn,
383 PyObject *preexec_fn_args_tuple)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000384{
Gregory P. Smith5591b022012-10-10 03:34:47 -0700385 int i, saved_errno, unused, reached_preexec = 0;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000386 PyObject *result;
Gregory P. Smith14affb82010-12-22 05:22:17 +0000387 const char* err_msg = "";
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000388 /* Buffer large enough to hold a hex integer. We can't malloc. */
389 char hex_errno[sizeof(saved_errno)*2+1];
390
Victor Stinnerdaf45552013-08-28 00:53:59 +0200391 if (make_inheritable(py_fds_to_keep, errpipe_write) < 0)
392 goto error;
393
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000394 /* Close parent's pipe ends. */
Victor Stinnerdaf45552013-08-28 00:53:59 +0200395 if (p2cwrite != -1)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000396 POSIX_CALL(close(p2cwrite));
Victor Stinnerdaf45552013-08-28 00:53:59 +0200397 if (c2pread != -1)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000398 POSIX_CALL(close(c2pread));
Victor Stinnerdaf45552013-08-28 00:53:59 +0200399 if (errread != -1)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000400 POSIX_CALL(close(errread));
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000401 POSIX_CALL(close(errpipe_read));
402
Ross Lagerwalld98646e2011-07-27 07:16:31 +0200403 /* When duping fds, if there arises a situation where one of the fds is
404 either 0, 1 or 2, it is possible that it is overwritten (#12607). */
405 if (c2pwrite == 0)
406 POSIX_CALL(c2pwrite = dup(c2pwrite));
407 if (errwrite == 0 || errwrite == 1)
408 POSIX_CALL(errwrite = dup(errwrite));
409
Antoine Pitrouc9c83ba2011-01-03 18:23:55 +0000410 /* Dup fds for child.
411 dup2() removes the CLOEXEC flag but we must do it ourselves if dup2()
412 would be a no-op (issue #10806). */
413 if (p2cread == 0) {
Victor Stinnerdaf45552013-08-28 00:53:59 +0200414 if (_Py_set_inheritable(p2cread, 1, NULL) < 0)
415 goto error;
416 }
417 else if (p2cread != -1)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000418 POSIX_CALL(dup2(p2cread, 0)); /* stdin */
Victor Stinnerdaf45552013-08-28 00:53:59 +0200419
Antoine Pitrouc9c83ba2011-01-03 18:23:55 +0000420 if (c2pwrite == 1) {
Victor Stinnerdaf45552013-08-28 00:53:59 +0200421 if (_Py_set_inheritable(c2pwrite, 1, NULL) < 0)
422 goto error;
423 }
424 else if (c2pwrite != -1)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000425 POSIX_CALL(dup2(c2pwrite, 1)); /* stdout */
Victor Stinnerdaf45552013-08-28 00:53:59 +0200426
Antoine Pitrouc9c83ba2011-01-03 18:23:55 +0000427 if (errwrite == 2) {
Victor Stinnerdaf45552013-08-28 00:53:59 +0200428 if (_Py_set_inheritable(errwrite, 1, NULL) < 0)
429 goto error;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000430 }
Victor Stinnerdaf45552013-08-28 00:53:59 +0200431 else if (errwrite != -1)
432 POSIX_CALL(dup2(errwrite, 2)); /* stderr */
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000433
434 /* Close pipe fds. Make sure we don't close the same fd more than */
435 /* once, or standard fds. */
Victor Stinnerdaf45552013-08-28 00:53:59 +0200436 if (p2cread > 2)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000437 POSIX_CALL(close(p2cread));
Victor Stinnerdaf45552013-08-28 00:53:59 +0200438 if (c2pwrite > 2 && c2pwrite != p2cread)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000439 POSIX_CALL(close(c2pwrite));
Victor Stinnerdaf45552013-08-28 00:53:59 +0200440 if (errwrite != c2pwrite && errwrite != p2cread && errwrite > 2)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000441 POSIX_CALL(close(errwrite));
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000442
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000443 if (cwd)
444 POSIX_CALL(chdir(cwd));
445
446 if (restore_signals)
447 _Py_RestoreSignals();
448
449#ifdef HAVE_SETSID
450 if (call_setsid)
451 POSIX_CALL(setsid());
452#endif
453
Gregory P. Smith5591b022012-10-10 03:34:47 -0700454 reached_preexec = 1;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000455 if (preexec_fn != Py_None && preexec_fn_args_tuple) {
456 /* This is where the user has asked us to deadlock their program. */
457 result = PyObject_Call(preexec_fn, preexec_fn_args_tuple, NULL);
458 if (result == NULL) {
459 /* Stringifying the exception or traceback would involve
460 * memory allocation and thus potential for deadlock.
461 * We've already faced potential deadlock by calling back
462 * into Python in the first place, so it probably doesn't
463 * matter but we avoid it to minimize the possibility. */
464 err_msg = "Exception occurred in preexec_fn.";
465 errno = 0; /* We don't want to report an OSError. */
466 goto error;
467 }
468 /* Py_DECREF(result); - We're about to exec so why bother? */
469 }
470
Charles-François Natali249cdc32013-08-25 18:24:45 +0200471 /* close FDs after executing preexec_fn, which might open FDs */
472 if (close_fds) {
Charles-François Natali249cdc32013-08-25 18:24:45 +0200473 /* TODO HP-UX could use pstat_getproc() if anyone cares about it. */
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700474 _close_open_fds(3, py_fds_to_keep);
Charles-François Natali249cdc32013-08-25 18:24:45 +0200475 }
476
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000477 /* This loop matches the Lib/os.py _execvpe()'s PATH search when */
478 /* given the executable_list generated by Lib/subprocess.py. */
479 saved_errno = 0;
480 for (i = 0; exec_array[i] != NULL; ++i) {
481 const char *executable = exec_array[i];
482 if (envp) {
483 execve(executable, argv, envp);
484 } else {
485 execv(executable, argv);
486 }
487 if (errno != ENOENT && errno != ENOTDIR && saved_errno == 0) {
488 saved_errno = errno;
489 }
490 }
491 /* Report the first exec error, not the last. */
492 if (saved_errno)
493 errno = saved_errno;
494
495error:
496 saved_errno = errno;
497 /* Report the posix error to our parent process. */
Gregory P. Smith12fdca52012-01-21 12:31:25 -0800498 /* We ignore all write() return values as the total size of our writes is
499 * less than PIPEBUF and we cannot do anything about an error anyways. */
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000500 if (saved_errno) {
501 char *cur;
Gregory P. Smith12fdca52012-01-21 12:31:25 -0800502 unused = write(errpipe_write, "OSError:", 8);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000503 cur = hex_errno + sizeof(hex_errno);
504 while (saved_errno != 0 && cur > hex_errno) {
505 *--cur = "0123456789ABCDEF"[saved_errno % 16];
506 saved_errno /= 16;
507 }
Gregory P. Smith12fdca52012-01-21 12:31:25 -0800508 unused = write(errpipe_write, cur, hex_errno + sizeof(hex_errno) - cur);
509 unused = write(errpipe_write, ":", 1);
Gregory P. Smith5591b022012-10-10 03:34:47 -0700510 if (!reached_preexec) {
511 /* Indicate to the parent that the error happened before exec(). */
512 unused = write(errpipe_write, "noexec", 6);
513 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000514 /* We can't call strerror(saved_errno). It is not async signal safe.
515 * The parent process will look the error message up. */
516 } else {
Gregory P. Smith8d07c262012-11-10 23:53:47 -0800517 unused = write(errpipe_write, "SubprocessError:0:", 18);
Gregory P. Smith12fdca52012-01-21 12:31:25 -0800518 unused = write(errpipe_write, err_msg, strlen(err_msg));
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000519 }
Gregory P. Smith12fdca52012-01-21 12:31:25 -0800520 if (unused) return; /* silly? yes! avoids gcc compiler warning. */
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000521}
522
523
524static PyObject *
525subprocess_fork_exec(PyObject* self, PyObject *args)
526{
527 PyObject *gc_module = NULL;
Antoine Pitrou721738f2012-08-15 23:20:39 +0200528 PyObject *executable_list, *py_fds_to_keep;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000529 PyObject *env_list, *preexec_fn;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000530 PyObject *process_args, *converted_args = NULL, *fast_args = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000531 PyObject *preexec_fn_args_tuple = NULL;
532 int p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite;
533 int errpipe_read, errpipe_write, close_fds, restore_signals;
534 int call_setsid;
Victor Stinner0e59cc32010-04-16 23:49:32 +0000535 PyObject *cwd_obj, *cwd_obj2;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000536 const char *cwd;
537 pid_t pid;
538 int need_to_reenable_gc = 0;
539 char *const *exec_array, *const *argv = NULL, *const *envp = NULL;
Gregory P. Smith8facece2012-01-21 14:01:08 -0800540 Py_ssize_t arg_num;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000541
542 if (!PyArg_ParseTuple(
Antoine Pitrou721738f2012-08-15 23:20:39 +0200543 args, "OOpOOOiiiiiiiiiiO:fork_exec",
544 &process_args, &executable_list, &close_fds, &py_fds_to_keep,
Victor Stinner0e59cc32010-04-16 23:49:32 +0000545 &cwd_obj, &env_list,
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000546 &p2cread, &p2cwrite, &c2pread, &c2pwrite,
547 &errread, &errwrite, &errpipe_read, &errpipe_write,
548 &restore_signals, &call_setsid, &preexec_fn))
549 return NULL;
550
Gregory P. Smith361e30c2013-12-01 00:12:24 -0800551 if (close_fds && errpipe_write < 3) { /* precondition */
552 PyErr_SetString(PyExc_ValueError, "errpipe_write must be >= 3");
553 return NULL;
554 }
Gregory P. Smith8facece2012-01-21 14:01:08 -0800555 if (PySequence_Length(py_fds_to_keep) < 0) {
556 PyErr_SetString(PyExc_ValueError, "cannot get length of fds_to_keep");
557 return NULL;
558 }
559 if (_sanity_check_python_fd_sequence(py_fds_to_keep)) {
560 PyErr_SetString(PyExc_ValueError, "bad value(s) in fds_to_keep");
Gregory P. Smithd4cc7bf2010-12-04 11:22:11 +0000561 return NULL;
562 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000563
564 /* We need to call gc.disable() when we'll be calling preexec_fn */
565 if (preexec_fn != Py_None) {
566 PyObject *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200567 _Py_IDENTIFIER(isenabled);
568 _Py_IDENTIFIER(disable);
Victor Stinnerdaf45552013-08-28 00:53:59 +0200569
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000570 gc_module = PyImport_ImportModule("gc");
571 if (gc_module == NULL)
572 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200573 result = _PyObject_CallMethodId(gc_module, &PyId_isenabled, NULL);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000574 if (result == NULL) {
575 Py_DECREF(gc_module);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000576 return NULL;
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000577 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000578 need_to_reenable_gc = PyObject_IsTrue(result);
579 Py_DECREF(result);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000580 if (need_to_reenable_gc == -1) {
581 Py_DECREF(gc_module);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000582 return NULL;
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000583 }
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200584 result = _PyObject_CallMethodId(gc_module, &PyId_disable, 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 Py_DECREF(result);
590 }
591
592 exec_array = _PySequence_BytesToCharpArray(executable_list);
Ross Lagerwallf2b34b82012-08-24 13:25:59 +0200593 if (!exec_array) {
594 Py_XDECREF(gc_module);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000595 return NULL;
Ross Lagerwallf2b34b82012-08-24 13:25:59 +0200596 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000597
598 /* Convert args and env into appropriate arguments for exec() */
599 /* These conversions are done in the parent process to avoid allocating
600 or freeing memory in the child process. */
601 if (process_args != Py_None) {
Gregory P. Smith68f52172010-03-15 06:07:42 +0000602 Py_ssize_t num_args;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000603 /* Equivalent to: */
604 /* tuple(PyUnicode_FSConverter(arg) for arg in process_args) */
Gregory P. Smith68f52172010-03-15 06:07:42 +0000605 fast_args = PySequence_Fast(process_args, "argv must be a tuple");
Stefan Krahdb579d72012-08-20 14:36:47 +0200606 if (fast_args == NULL)
607 goto cleanup;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000608 num_args = PySequence_Fast_GET_SIZE(fast_args);
609 converted_args = PyTuple_New(num_args);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000610 if (converted_args == NULL)
611 goto cleanup;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000612 for (arg_num = 0; arg_num < num_args; ++arg_num) {
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000613 PyObject *borrowed_arg, *converted_arg;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000614 borrowed_arg = PySequence_Fast_GET_ITEM(fast_args, arg_num);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000615 if (PyUnicode_FSConverter(borrowed_arg, &converted_arg) == 0)
616 goto cleanup;
617 PyTuple_SET_ITEM(converted_args, arg_num, converted_arg);
618 }
619
620 argv = _PySequence_BytesToCharpArray(converted_args);
621 Py_CLEAR(converted_args);
Gregory P. Smith68f52172010-03-15 06:07:42 +0000622 Py_CLEAR(fast_args);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000623 if (!argv)
624 goto cleanup;
625 }
626
627 if (env_list != Py_None) {
628 envp = _PySequence_BytesToCharpArray(env_list);
629 if (!envp)
630 goto cleanup;
631 }
632
633 if (preexec_fn != Py_None) {
634 preexec_fn_args_tuple = PyTuple_New(0);
635 if (!preexec_fn_args_tuple)
636 goto cleanup;
Victor Stinner0e59cc32010-04-16 23:49:32 +0000637 _PyImport_AcquireLock();
638 }
639
640 if (cwd_obj != Py_None) {
641 if (PyUnicode_FSConverter(cwd_obj, &cwd_obj2) == 0)
642 goto cleanup;
Victor Stinnerdcb24032010-04-22 12:08:36 +0000643 cwd = PyBytes_AsString(cwd_obj2);
Victor Stinner0e59cc32010-04-16 23:49:32 +0000644 } else {
645 cwd = NULL;
646 cwd_obj2 = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000647 }
648
649 pid = fork();
650 if (pid == 0) {
651 /* Child process */
Victor Stinner0e59cc32010-04-16 23:49:32 +0000652 /*
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000653 * Code from here to _exit() must only use async-signal-safe functions,
654 * listed at `man 7 signal` or
655 * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
656 */
657
658 if (preexec_fn != Py_None) {
659 /* We'll be calling back into Python later so we need to do this.
660 * This call may not be async-signal-safe but neither is calling
661 * back into Python. The user asked us to use hope as a strategy
662 * to avoid deadlock... */
663 PyOS_AfterFork();
664 }
665
666 child_exec(exec_array, argv, envp, cwd,
667 p2cread, p2cwrite, c2pread, c2pwrite,
668 errread, errwrite, errpipe_read, errpipe_write,
669 close_fds, restore_signals, call_setsid,
Gregory P. Smith8facece2012-01-21 14:01:08 -0800670 py_fds_to_keep, preexec_fn, preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000671 _exit(255);
672 return NULL; /* Dead code to avoid a potential compiler warning. */
673 }
Victor Stinner0e59cc32010-04-16 23:49:32 +0000674 Py_XDECREF(cwd_obj2);
675
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000676 if (pid == -1) {
677 /* Capture the errno exception before errno can be clobbered. */
678 PyErr_SetFromErrno(PyExc_OSError);
679 }
680 if (preexec_fn != Py_None &&
681 _PyImport_ReleaseLock() < 0 && !PyErr_Occurred()) {
682 PyErr_SetString(PyExc_RuntimeError,
683 "not holding the import lock");
684 }
685
686 /* Parent process */
687 if (envp)
688 _Py_FreeCharPArray(envp);
689 if (argv)
690 _Py_FreeCharPArray(argv);
691 _Py_FreeCharPArray(exec_array);
692
693 /* Reenable gc in the parent process (or if fork failed). */
694 if (need_to_reenable_gc && _enable_gc(gc_module)) {
695 Py_XDECREF(gc_module);
696 return NULL;
697 }
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000698 Py_XDECREF(preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000699 Py_XDECREF(gc_module);
700
701 if (pid == -1)
702 return NULL; /* fork() failed. Exception set earlier. */
703
704 return PyLong_FromPid(pid);
705
706cleanup:
707 if (envp)
708 _Py_FreeCharPArray(envp);
709 if (argv)
710 _Py_FreeCharPArray(argv);
711 _Py_FreeCharPArray(exec_array);
712 Py_XDECREF(converted_args);
Gregory P. Smith68f52172010-03-15 06:07:42 +0000713 Py_XDECREF(fast_args);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000714 Py_XDECREF(preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000715
716 /* Reenable gc if it was disabled. */
717 if (need_to_reenable_gc)
718 _enable_gc(gc_module);
719 Py_XDECREF(gc_module);
720 return NULL;
721}
722
723
724PyDoc_STRVAR(subprocess_fork_exec_doc,
725"fork_exec(args, executable_list, close_fds, cwd, env,\n\
726 p2cread, p2cwrite, c2pread, c2pwrite,\n\
727 errread, errwrite, errpipe_read, errpipe_write,\n\
728 restore_signals, call_setsid, preexec_fn)\n\
729\n\
730Forks a child process, closes parent file descriptors as appropriate in the\n\
731child and dups the few that are needed before calling exec() in the child\n\
732process.\n\
733\n\
734The preexec_fn, if supplied, will be called immediately before exec.\n\
735WARNING: preexec_fn is NOT SAFE if your application uses threads.\n\
736 It may trigger infrequent, difficult to debug deadlocks.\n\
737\n\
738If an error occurs in the child process before the exec, it is\n\
739serialized and written to the errpipe_write fd per subprocess.py.\n\
740\n\
741Returns: the child process's PID.\n\
742\n\
743Raises: Only on an error in the parent process.\n\
744");
745
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000746/* module level code ********************************************************/
747
748PyDoc_STRVAR(module_doc,
749"A POSIX helper for the subprocess module.");
750
751
752static PyMethodDef module_methods[] = {
753 {"fork_exec", subprocess_fork_exec, METH_VARARGS, subprocess_fork_exec_doc},
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000754 {NULL, NULL} /* sentinel */
755};
756
757
758static struct PyModuleDef _posixsubprocessmodule = {
759 PyModuleDef_HEAD_INIT,
760 "_posixsubprocess",
761 module_doc,
762 -1, /* No memory is needed. */
763 module_methods,
764};
765
766PyMODINIT_FUNC
767PyInit__posixsubprocess(void)
768{
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000769 return PyModule_Create(&_posixsubprocessmodule);
770}