blob: 8d3af6e877fbfd06244345a10eac01c63a5212e8 [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. Smithe3f78482012-01-21 15:16:17 -080021#if defined(sun)
22/* readdir64 is used to work around Solaris 9 bug 6395699. */
23# define readdir readdir64
24# define dirent dirent64
25# if !defined(HAVE_DIRFD)
Gregory P. Smith8facece2012-01-21 14:01:08 -080026/* Some versions of Solaris lack dirfd(). */
Gregory P. Smithe9b7cab2012-01-21 15:19:11 -080027# define dirfd(dirp) ((dirp)->dd_fd)
Gregory P. Smithe3f78482012-01-21 15:16:17 -080028# define HAVE_DIRFD
Gregory P. Smithe3f78482012-01-21 15:16:17 -080029# endif
Gregory P. Smith8facece2012-01-21 14:01:08 -080030#endif
31
Gregory P. Smith4842efc2012-01-21 21:01:24 -080032#if defined(__FreeBSD__) || (defined(__APPLE__) && defined(__MACH__))
33# define FD_DIR "/dev/fd"
34#else
35# define FD_DIR "/proc/self/fd"
36#endif
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +000037
38#define POSIX_CALL(call) if ((call) == -1) goto error
39
40
41/* Maximum file descriptor, initialized on module load. */
42static long max_fd;
43
44
45/* Given the gc module call gc.enable() and return 0 on success. */
Benjamin Peterson91eef982012-01-22 20:04:46 -050046static int
47_enable_gc(PyObject *gc_module)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +000048{
49 PyObject *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020050 _Py_IDENTIFIER(enable);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +020051
52 result = _PyObject_CallMethodId(gc_module, &PyId_enable, NULL);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +000053 if (result == NULL)
54 return 1;
55 Py_DECREF(result);
56 return 0;
57}
58
59
Gregory P. Smith8facece2012-01-21 14:01:08 -080060/* Convert ASCII to a positive int, no libc call. no overflow. -1 on error. */
Benjamin Peterson91eef982012-01-22 20:04:46 -050061static int
62_pos_int_from_ascii(char *name)
Gregory P. Smith8facece2012-01-21 14:01:08 -080063{
64 int num = 0;
65 while (*name >= '0' && *name <= '9') {
66 num = num * 10 + (*name - '0');
67 ++name;
68 }
69 if (*name)
70 return -1; /* Non digit found, not a number. */
71 return num;
72}
73
74
Gregory P. Smith4842efc2012-01-21 21:01:24 -080075#if defined(__FreeBSD__)
76/* When /dev/fd isn't mounted it is often a static directory populated
77 * with 0 1 2 or entries for 0 .. 63 on FreeBSD, NetBSD and OpenBSD.
78 * NetBSD and OpenBSD have a /proc fs available (though not necessarily
79 * mounted) and do not have fdescfs for /dev/fd. MacOS X has a devfs
80 * that properly supports /dev/fd.
81 */
Benjamin Peterson91eef982012-01-22 20:04:46 -050082static int
Ross Lagerwall7f4fdb22012-03-07 20:06:33 +020083_is_fdescfs_mounted_on_dev_fd(void)
Gregory P. Smith4842efc2012-01-21 21:01:24 -080084{
85 struct stat dev_stat;
86 struct stat dev_fd_stat;
87 if (stat("/dev", &dev_stat) != 0)
88 return 0;
89 if (stat(FD_DIR, &dev_fd_stat) != 0)
90 return 0;
91 if (dev_stat.st_dev == dev_fd_stat.st_dev)
92 return 0; /* / == /dev == /dev/fd means it is static. #fail */
93 return 1;
94}
95#endif
96
97
Gregory P. Smith8facece2012-01-21 14:01:08 -080098/* Returns 1 if there is a problem with fd_sequence, 0 otherwise. */
Benjamin Peterson91eef982012-01-22 20:04:46 -050099static int
100_sanity_check_python_fd_sequence(PyObject *fd_sequence)
Gregory P. Smith8facece2012-01-21 14:01:08 -0800101{
102 Py_ssize_t seq_idx, seq_len = PySequence_Length(fd_sequence);
103 long prev_fd = -1;
104 for (seq_idx = 0; seq_idx < seq_len; ++seq_idx) {
105 PyObject* py_fd = PySequence_Fast_GET_ITEM(fd_sequence, seq_idx);
106 long iter_fd = PyLong_AsLong(py_fd);
107 if (iter_fd < 0 || iter_fd < prev_fd || iter_fd > INT_MAX) {
108 /* Negative, overflow, not a Long, unsorted, too big for a fd. */
109 return 1;
110 }
111 }
112 return 0;
113}
114
115
116/* Is fd found in the sorted Python Sequence? */
Benjamin Peterson91eef982012-01-22 20:04:46 -0500117static int
118_is_fd_in_sorted_fd_sequence(int fd, PyObject *fd_sequence)
Gregory P. Smith8facece2012-01-21 14:01:08 -0800119{
120 /* Binary search. */
121 Py_ssize_t search_min = 0;
122 Py_ssize_t search_max = PySequence_Length(fd_sequence) - 1;
123 if (search_max < 0)
124 return 0;
125 do {
126 long middle = (search_min + search_max) / 2;
127 long middle_fd = PyLong_AsLong(
128 PySequence_Fast_GET_ITEM(fd_sequence, middle));
129 if (fd == middle_fd)
130 return 1;
131 if (fd > middle_fd)
132 search_min = middle + 1;
133 else
134 search_max = middle - 1;
135 } while (search_min <= search_max);
136 return 0;
137}
138
139
140/* Close all file descriptors in the range start_fd inclusive to
141 * end_fd exclusive except for those in py_fds_to_keep. If the
142 * range defined by [start_fd, end_fd) is large this will take a
143 * long time as it calls close() on EVERY possible fd.
144 */
Benjamin Peterson91eef982012-01-22 20:04:46 -0500145static void
146_close_fds_by_brute_force(int start_fd, int end_fd, PyObject *py_fds_to_keep)
Gregory P. Smith8facece2012-01-21 14:01:08 -0800147{
148 Py_ssize_t num_fds_to_keep = PySequence_Length(py_fds_to_keep);
149 Py_ssize_t keep_seq_idx;
150 int fd_num;
151 /* As py_fds_to_keep is sorted we can loop through the list closing
152 * fds inbetween any in the keep list falling within our range. */
153 for (keep_seq_idx = 0; keep_seq_idx < num_fds_to_keep; ++keep_seq_idx) {
154 PyObject* py_keep_fd = PySequence_Fast_GET_ITEM(py_fds_to_keep,
155 keep_seq_idx);
156 int keep_fd = PyLong_AsLong(py_keep_fd);
157 if (keep_fd < start_fd)
158 continue;
159 for (fd_num = start_fd; fd_num < keep_fd; ++fd_num) {
160 while (close(fd_num) < 0 && errno == EINTR);
161 }
162 start_fd = keep_fd + 1;
163 }
164 if (start_fd <= end_fd) {
165 for (fd_num = start_fd; fd_num < end_fd; ++fd_num) {
166 while (close(fd_num) < 0 && errno == EINTR);
167 }
168 }
169}
170
171
172#if defined(__linux__) && defined(HAVE_SYS_SYSCALL_H)
173/* It doesn't matter if d_name has room for NAME_MAX chars; we're using this
174 * only to read a directory of short file descriptor number names. The kernel
175 * will return an error if we didn't give it enough space. Highly Unlikely.
176 * This structure is very old and stable: It will not change unless the kernel
177 * chooses to break compatibility with all existing binaries. Highly Unlikely.
178 */
179struct linux_dirent {
180 unsigned long d_ino; /* Inode number */
181 unsigned long d_off; /* Offset to next linux_dirent */
182 unsigned short d_reclen; /* Length of this linux_dirent */
183 char d_name[256]; /* Filename (null-terminated) */
184};
185
186/* Close all open file descriptors in the range start_fd inclusive to end_fd
187 * exclusive. Do not close any in the sorted py_fds_to_keep list.
188 *
189 * This version is async signal safe as it does not make any unsafe C library
190 * calls, malloc calls or handle any locks. It is _unfortunate_ to be forced
191 * to resort to making a kernel system call directly but this is the ONLY api
192 * available that does no harm. opendir/readdir/closedir perform memory
193 * allocation and locking so while they usually work they are not guaranteed
194 * to (especially if you have replaced your malloc implementation). A version
195 * of this function that uses those can be found in the _maybe_unsafe variant.
196 *
197 * This is Linux specific because that is all I am ready to test it on. It
198 * should be easy to add OS specific dirent or dirent64 structures and modify
199 * it with some cpp #define magic to work on other OSes as well if you want.
200 */
Benjamin Peterson91eef982012-01-22 20:04:46 -0500201static void
202_close_open_fd_range_safe(int start_fd, int end_fd, PyObject* py_fds_to_keep)
Gregory P. Smith8facece2012-01-21 14:01:08 -0800203{
204 int fd_dir_fd;
205 if (start_fd >= end_fd)
206 return;
Ross Lagerwall5802fdf2012-03-18 15:55:10 +0200207#ifdef O_CLOEXEC
208 fd_dir_fd = open(FD_DIR, O_RDONLY | O_CLOEXEC, 0);
209#else
210 fd_dir_fd = open(FD_DIR, O_RDONLY, 0);
211#ifdef FD_CLOEXEC
212 {
213 int old = fcntl(fd_dir_fd, F_GETFD);
214 if (old != -1)
215 fcntl(fd_dir_fd, F_SETFD, old | FD_CLOEXEC);
216 }
217#endif
218#endif
Gregory P. Smith8facece2012-01-21 14:01:08 -0800219 if (fd_dir_fd == -1) {
220 /* No way to get a list of open fds. */
221 _close_fds_by_brute_force(start_fd, end_fd, py_fds_to_keep);
222 return;
223 } else {
224 char buffer[sizeof(struct linux_dirent)];
225 int bytes;
226 while ((bytes = syscall(SYS_getdents, fd_dir_fd,
227 (struct linux_dirent *)buffer,
228 sizeof(buffer))) > 0) {
229 struct linux_dirent *entry;
230 int offset;
231 for (offset = 0; offset < bytes; offset += entry->d_reclen) {
232 int fd;
233 entry = (struct linux_dirent *)(buffer + offset);
234 if ((fd = _pos_int_from_ascii(entry->d_name)) < 0)
235 continue; /* Not a number. */
236 if (fd != fd_dir_fd && fd >= start_fd && fd < end_fd &&
237 !_is_fd_in_sorted_fd_sequence(fd, py_fds_to_keep)) {
238 while (close(fd) < 0 && errno == EINTR);
239 }
240 }
241 }
242 close(fd_dir_fd);
243 }
244}
245
246#define _close_open_fd_range _close_open_fd_range_safe
247
248#else /* NOT (defined(__linux__) && defined(HAVE_SYS_SYSCALL_H)) */
249
250
251/* Close all open file descriptors in the range start_fd inclusive to end_fd
252 * exclusive. Do not close any in the sorted py_fds_to_keep list.
253 *
254 * This function violates the strict use of async signal safe functions. :(
Gregory P. Smithe3f78482012-01-21 15:16:17 -0800255 * It calls opendir(), readdir() and closedir(). Of these, the one most
Gregory P. Smith8facece2012-01-21 14:01:08 -0800256 * likely to ever cause a problem is opendir() as it performs an internal
257 * malloc(). Practically this should not be a problem. The Java VM makes the
258 * same calls between fork and exec in its own UNIXProcess_md.c implementation.
259 *
260 * readdir_r() is not used because it provides no benefit. It is typically
261 * implemented as readdir() followed by memcpy(). See also:
262 * http://womble.decadent.org.uk/readdir_r-advisory.html
263 */
Benjamin Peterson91eef982012-01-22 20:04:46 -0500264static void
265_close_open_fd_range_maybe_unsafe(int start_fd, int end_fd,
266 PyObject* py_fds_to_keep)
Gregory P. Smith8facece2012-01-21 14:01:08 -0800267{
268 DIR *proc_fd_dir;
269#ifndef HAVE_DIRFD
270 while (_is_fd_in_sorted_fd_sequence(start_fd, py_fds_to_keep) &&
271 (start_fd < end_fd)) {
272 ++start_fd;
273 }
274 if (start_fd >= end_fd)
275 return;
276 /* Close our lowest fd before we call opendir so that it is likely to
277 * reuse that fd otherwise we might close opendir's file descriptor in
278 * our loop. This trick assumes that fd's are allocated on a lowest
279 * available basis. */
280 while (close(start_fd) < 0 && errno == EINTR);
281 ++start_fd;
282#endif
283 if (start_fd >= end_fd)
284 return;
285
Gregory P. Smith4842efc2012-01-21 21:01:24 -0800286#if defined(__FreeBSD__)
287 if (!_is_fdescfs_mounted_on_dev_fd())
288 proc_fd_dir = NULL;
289 else
290#endif
291 proc_fd_dir = opendir(FD_DIR);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800292 if (!proc_fd_dir) {
293 /* No way to get a list of open fds. */
294 _close_fds_by_brute_force(start_fd, end_fd, py_fds_to_keep);
295 } else {
Gregory P. Smithe3f78482012-01-21 15:16:17 -0800296 struct dirent *dir_entry;
Gregory P. Smith8facece2012-01-21 14:01:08 -0800297#ifdef HAVE_DIRFD
Gregory P. Smithe9b7cab2012-01-21 15:19:11 -0800298 int fd_used_by_opendir = dirfd(proc_fd_dir);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800299#else
300 int fd_used_by_opendir = start_fd - 1;
301#endif
302 errno = 0;
Gregory P. Smithe3f78482012-01-21 15:16:17 -0800303 while ((dir_entry = readdir(proc_fd_dir))) {
Gregory P. Smith8facece2012-01-21 14:01:08 -0800304 int fd;
305 if ((fd = _pos_int_from_ascii(dir_entry->d_name)) < 0)
306 continue; /* Not a number. */
307 if (fd != fd_used_by_opendir && fd >= start_fd && fd < end_fd &&
308 !_is_fd_in_sorted_fd_sequence(fd, py_fds_to_keep)) {
309 while (close(fd) < 0 && errno == EINTR);
310 }
311 errno = 0;
312 }
313 if (errno) {
314 /* readdir error, revert behavior. Highly Unlikely. */
315 _close_fds_by_brute_force(start_fd, end_fd, py_fds_to_keep);
316 }
317 closedir(proc_fd_dir);
318 }
319}
320
321#define _close_open_fd_range _close_open_fd_range_maybe_unsafe
322
323#endif /* else NOT (defined(__linux__) && defined(HAVE_SYS_SYSCALL_H)) */
324
325
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000326/*
327 * This function is code executed in the child process immediately after fork
328 * to set things up and call exec().
329 *
330 * All of the code in this function must only use async-signal-safe functions,
331 * listed at `man 7 signal` or
332 * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
333 *
334 * This restriction is documented at
335 * http://www.opengroup.org/onlinepubs/009695399/functions/fork.html.
336 */
Benjamin Peterson91eef982012-01-22 20:04:46 -0500337static void
338child_exec(char *const exec_array[],
339 char *const argv[],
340 char *const envp[],
341 const char *cwd,
342 int p2cread, int p2cwrite,
343 int c2pread, int c2pwrite,
344 int errread, int errwrite,
345 int errpipe_read, int errpipe_write,
346 int close_fds, int restore_signals,
347 int call_setsid,
348 PyObject *py_fds_to_keep,
349 PyObject *preexec_fn,
350 PyObject *preexec_fn_args_tuple)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000351{
Gregory P. Smith8facece2012-01-21 14:01:08 -0800352 int i, saved_errno, unused;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000353 PyObject *result;
Gregory P. Smith14affb82010-12-22 05:22:17 +0000354 const char* err_msg = "";
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000355 /* Buffer large enough to hold a hex integer. We can't malloc. */
356 char hex_errno[sizeof(saved_errno)*2+1];
357
358 /* Close parent's pipe ends. */
359 if (p2cwrite != -1) {
360 POSIX_CALL(close(p2cwrite));
361 }
362 if (c2pread != -1) {
363 POSIX_CALL(close(c2pread));
364 }
365 if (errread != -1) {
366 POSIX_CALL(close(errread));
367 }
368 POSIX_CALL(close(errpipe_read));
369
Ross Lagerwalld98646e2011-07-27 07:16:31 +0200370 /* When duping fds, if there arises a situation where one of the fds is
371 either 0, 1 or 2, it is possible that it is overwritten (#12607). */
372 if (c2pwrite == 0)
373 POSIX_CALL(c2pwrite = dup(c2pwrite));
374 if (errwrite == 0 || errwrite == 1)
375 POSIX_CALL(errwrite = dup(errwrite));
376
Antoine Pitrouc9c83ba2011-01-03 18:23:55 +0000377 /* Dup fds for child.
378 dup2() removes the CLOEXEC flag but we must do it ourselves if dup2()
379 would be a no-op (issue #10806). */
380 if (p2cread == 0) {
381 int old = fcntl(p2cread, F_GETFD);
382 if (old != -1)
383 fcntl(p2cread, F_SETFD, old & ~FD_CLOEXEC);
384 } else if (p2cread != -1) {
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000385 POSIX_CALL(dup2(p2cread, 0)); /* stdin */
386 }
Antoine Pitrouc9c83ba2011-01-03 18:23:55 +0000387 if (c2pwrite == 1) {
388 int old = fcntl(c2pwrite, F_GETFD);
389 if (old != -1)
390 fcntl(c2pwrite, F_SETFD, old & ~FD_CLOEXEC);
391 } else if (c2pwrite != -1) {
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000392 POSIX_CALL(dup2(c2pwrite, 1)); /* stdout */
393 }
Antoine Pitrouc9c83ba2011-01-03 18:23:55 +0000394 if (errwrite == 2) {
395 int old = fcntl(errwrite, F_GETFD);
396 if (old != -1)
397 fcntl(errwrite, F_SETFD, old & ~FD_CLOEXEC);
398 } else if (errwrite != -1) {
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000399 POSIX_CALL(dup2(errwrite, 2)); /* stderr */
400 }
401
402 /* Close pipe fds. Make sure we don't close the same fd more than */
403 /* once, or standard fds. */
Antoine Pitrouc9c83ba2011-01-03 18:23:55 +0000404 if (p2cread > 2) {
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000405 POSIX_CALL(close(p2cread));
406 }
Gregory P. Smith81218982011-03-15 14:56:39 -0400407 if (c2pwrite > 2 && c2pwrite != p2cread) {
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000408 POSIX_CALL(close(c2pwrite));
409 }
Gregory P. Smith81218982011-03-15 14:56:39 -0400410 if (errwrite != c2pwrite && errwrite != p2cread && errwrite > 2) {
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000411 POSIX_CALL(close(errwrite));
412 }
413
Gregory P. Smith4842efc2012-01-21 21:01:24 -0800414 if (close_fds) {
415 int local_max_fd = max_fd;
416#if defined(__NetBSD__)
417 local_max_fd = fcntl(0, F_MAXFD);
418 if (local_max_fd < 0)
419 local_max_fd = max_fd;
420#endif
421 /* TODO HP-UX could use pstat_getproc() if anyone cares about it. */
422 _close_open_fd_range(3, local_max_fd, py_fds_to_keep);
423 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000424
425 if (cwd)
426 POSIX_CALL(chdir(cwd));
427
428 if (restore_signals)
429 _Py_RestoreSignals();
430
431#ifdef HAVE_SETSID
432 if (call_setsid)
433 POSIX_CALL(setsid());
434#endif
435
436 if (preexec_fn != Py_None && preexec_fn_args_tuple) {
437 /* This is where the user has asked us to deadlock their program. */
438 result = PyObject_Call(preexec_fn, preexec_fn_args_tuple, NULL);
439 if (result == NULL) {
440 /* Stringifying the exception or traceback would involve
441 * memory allocation and thus potential for deadlock.
442 * We've already faced potential deadlock by calling back
443 * into Python in the first place, so it probably doesn't
444 * matter but we avoid it to minimize the possibility. */
445 err_msg = "Exception occurred in preexec_fn.";
446 errno = 0; /* We don't want to report an OSError. */
447 goto error;
448 }
449 /* Py_DECREF(result); - We're about to exec so why bother? */
450 }
451
452 /* This loop matches the Lib/os.py _execvpe()'s PATH search when */
453 /* given the executable_list generated by Lib/subprocess.py. */
454 saved_errno = 0;
455 for (i = 0; exec_array[i] != NULL; ++i) {
456 const char *executable = exec_array[i];
457 if (envp) {
458 execve(executable, argv, envp);
459 } else {
460 execv(executable, argv);
461 }
462 if (errno != ENOENT && errno != ENOTDIR && saved_errno == 0) {
463 saved_errno = errno;
464 }
465 }
466 /* Report the first exec error, not the last. */
467 if (saved_errno)
468 errno = saved_errno;
469
470error:
471 saved_errno = errno;
472 /* Report the posix error to our parent process. */
Gregory P. Smith12fdca52012-01-21 12:31:25 -0800473 /* We ignore all write() return values as the total size of our writes is
474 * less than PIPEBUF and we cannot do anything about an error anyways. */
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000475 if (saved_errno) {
476 char *cur;
Gregory P. Smith12fdca52012-01-21 12:31:25 -0800477 unused = write(errpipe_write, "OSError:", 8);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000478 cur = hex_errno + sizeof(hex_errno);
479 while (saved_errno != 0 && cur > hex_errno) {
480 *--cur = "0123456789ABCDEF"[saved_errno % 16];
481 saved_errno /= 16;
482 }
Gregory P. Smith12fdca52012-01-21 12:31:25 -0800483 unused = write(errpipe_write, cur, hex_errno + sizeof(hex_errno) - cur);
484 unused = write(errpipe_write, ":", 1);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000485 /* We can't call strerror(saved_errno). It is not async signal safe.
486 * The parent process will look the error message up. */
487 } else {
Gregory P. Smith12fdca52012-01-21 12:31:25 -0800488 unused = write(errpipe_write, "RuntimeError:0:", 15);
489 unused = write(errpipe_write, err_msg, strlen(err_msg));
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000490 }
Gregory P. Smith12fdca52012-01-21 12:31:25 -0800491 if (unused) return; /* silly? yes! avoids gcc compiler warning. */
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000492}
493
494
495static PyObject *
496subprocess_fork_exec(PyObject* self, PyObject *args)
497{
498 PyObject *gc_module = NULL;
Gregory P. Smithd4cc7bf2010-12-04 11:22:11 +0000499 PyObject *executable_list, *py_close_fds, *py_fds_to_keep;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000500 PyObject *env_list, *preexec_fn;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000501 PyObject *process_args, *converted_args = NULL, *fast_args = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000502 PyObject *preexec_fn_args_tuple = NULL;
503 int p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite;
504 int errpipe_read, errpipe_write, close_fds, restore_signals;
505 int call_setsid;
Victor Stinner0e59cc32010-04-16 23:49:32 +0000506 PyObject *cwd_obj, *cwd_obj2;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000507 const char *cwd;
508 pid_t pid;
509 int need_to_reenable_gc = 0;
510 char *const *exec_array, *const *argv = NULL, *const *envp = NULL;
Gregory P. Smith8facece2012-01-21 14:01:08 -0800511 Py_ssize_t arg_num;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000512
513 if (!PyArg_ParseTuple(
Gregory P. Smithd4cc7bf2010-12-04 11:22:11 +0000514 args, "OOOOOOiiiiiiiiiiO:fork_exec",
515 &process_args, &executable_list, &py_close_fds, &py_fds_to_keep,
Victor Stinner0e59cc32010-04-16 23:49:32 +0000516 &cwd_obj, &env_list,
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000517 &p2cread, &p2cwrite, &c2pread, &c2pwrite,
518 &errread, &errwrite, &errpipe_read, &errpipe_write,
519 &restore_signals, &call_setsid, &preexec_fn))
520 return NULL;
521
522 close_fds = PyObject_IsTrue(py_close_fds);
523 if (close_fds && errpipe_write < 3) { /* precondition */
524 PyErr_SetString(PyExc_ValueError, "errpipe_write must be >= 3");
525 return NULL;
526 }
Gregory P. Smith8facece2012-01-21 14:01:08 -0800527 if (PySequence_Length(py_fds_to_keep) < 0) {
528 PyErr_SetString(PyExc_ValueError, "cannot get length of fds_to_keep");
529 return NULL;
530 }
531 if (_sanity_check_python_fd_sequence(py_fds_to_keep)) {
532 PyErr_SetString(PyExc_ValueError, "bad value(s) in fds_to_keep");
Gregory P. Smithd4cc7bf2010-12-04 11:22:11 +0000533 return NULL;
534 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000535
536 /* We need to call gc.disable() when we'll be calling preexec_fn */
537 if (preexec_fn != Py_None) {
538 PyObject *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200539 _Py_IDENTIFIER(isenabled);
540 _Py_IDENTIFIER(disable);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200541
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000542 gc_module = PyImport_ImportModule("gc");
543 if (gc_module == NULL)
544 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200545 result = _PyObject_CallMethodId(gc_module, &PyId_isenabled, NULL);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000546 if (result == NULL) {
547 Py_DECREF(gc_module);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000548 return NULL;
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000549 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000550 need_to_reenable_gc = PyObject_IsTrue(result);
551 Py_DECREF(result);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000552 if (need_to_reenable_gc == -1) {
553 Py_DECREF(gc_module);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000554 return NULL;
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000555 }
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200556 result = _PyObject_CallMethodId(gc_module, &PyId_disable, NULL);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000557 if (result == NULL) {
558 Py_DECREF(gc_module);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000559 return NULL;
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000560 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000561 Py_DECREF(result);
562 }
563
564 exec_array = _PySequence_BytesToCharpArray(executable_list);
565 if (!exec_array)
566 return NULL;
567
568 /* Convert args and env into appropriate arguments for exec() */
569 /* These conversions are done in the parent process to avoid allocating
570 or freeing memory in the child process. */
571 if (process_args != Py_None) {
Gregory P. Smith68f52172010-03-15 06:07:42 +0000572 Py_ssize_t num_args;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000573 /* Equivalent to: */
574 /* tuple(PyUnicode_FSConverter(arg) for arg in process_args) */
Gregory P. Smith68f52172010-03-15 06:07:42 +0000575 fast_args = PySequence_Fast(process_args, "argv must be a tuple");
576 num_args = PySequence_Fast_GET_SIZE(fast_args);
577 converted_args = PyTuple_New(num_args);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000578 if (converted_args == NULL)
579 goto cleanup;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000580 for (arg_num = 0; arg_num < num_args; ++arg_num) {
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000581 PyObject *borrowed_arg, *converted_arg;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000582 borrowed_arg = PySequence_Fast_GET_ITEM(fast_args, arg_num);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000583 if (PyUnicode_FSConverter(borrowed_arg, &converted_arg) == 0)
584 goto cleanup;
585 PyTuple_SET_ITEM(converted_args, arg_num, converted_arg);
586 }
587
588 argv = _PySequence_BytesToCharpArray(converted_args);
589 Py_CLEAR(converted_args);
Gregory P. Smith68f52172010-03-15 06:07:42 +0000590 Py_CLEAR(fast_args);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000591 if (!argv)
592 goto cleanup;
593 }
594
595 if (env_list != Py_None) {
596 envp = _PySequence_BytesToCharpArray(env_list);
597 if (!envp)
598 goto cleanup;
599 }
600
601 if (preexec_fn != Py_None) {
602 preexec_fn_args_tuple = PyTuple_New(0);
603 if (!preexec_fn_args_tuple)
604 goto cleanup;
Victor Stinner0e59cc32010-04-16 23:49:32 +0000605 _PyImport_AcquireLock();
606 }
607
608 if (cwd_obj != Py_None) {
609 if (PyUnicode_FSConverter(cwd_obj, &cwd_obj2) == 0)
610 goto cleanup;
Victor Stinnerdcb24032010-04-22 12:08:36 +0000611 cwd = PyBytes_AsString(cwd_obj2);
Victor Stinner0e59cc32010-04-16 23:49:32 +0000612 } else {
613 cwd = NULL;
614 cwd_obj2 = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000615 }
616
617 pid = fork();
618 if (pid == 0) {
619 /* Child process */
Victor Stinner0e59cc32010-04-16 23:49:32 +0000620 /*
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000621 * Code from here to _exit() must only use async-signal-safe functions,
622 * listed at `man 7 signal` or
623 * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
624 */
625
626 if (preexec_fn != Py_None) {
627 /* We'll be calling back into Python later so we need to do this.
628 * This call may not be async-signal-safe but neither is calling
629 * back into Python. The user asked us to use hope as a strategy
630 * to avoid deadlock... */
631 PyOS_AfterFork();
632 }
633
634 child_exec(exec_array, argv, envp, cwd,
635 p2cread, p2cwrite, c2pread, c2pwrite,
636 errread, errwrite, errpipe_read, errpipe_write,
637 close_fds, restore_signals, call_setsid,
Gregory P. Smith8facece2012-01-21 14:01:08 -0800638 py_fds_to_keep, preexec_fn, preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000639 _exit(255);
640 return NULL; /* Dead code to avoid a potential compiler warning. */
641 }
Victor Stinner0e59cc32010-04-16 23:49:32 +0000642 Py_XDECREF(cwd_obj2);
643
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000644 if (pid == -1) {
645 /* Capture the errno exception before errno can be clobbered. */
646 PyErr_SetFromErrno(PyExc_OSError);
647 }
648 if (preexec_fn != Py_None &&
649 _PyImport_ReleaseLock() < 0 && !PyErr_Occurred()) {
650 PyErr_SetString(PyExc_RuntimeError,
651 "not holding the import lock");
652 }
653
654 /* Parent process */
655 if (envp)
656 _Py_FreeCharPArray(envp);
657 if (argv)
658 _Py_FreeCharPArray(argv);
659 _Py_FreeCharPArray(exec_array);
660
661 /* Reenable gc in the parent process (or if fork failed). */
662 if (need_to_reenable_gc && _enable_gc(gc_module)) {
663 Py_XDECREF(gc_module);
664 return NULL;
665 }
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000666 Py_XDECREF(preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000667 Py_XDECREF(gc_module);
668
669 if (pid == -1)
670 return NULL; /* fork() failed. Exception set earlier. */
671
672 return PyLong_FromPid(pid);
673
674cleanup:
675 if (envp)
676 _Py_FreeCharPArray(envp);
677 if (argv)
678 _Py_FreeCharPArray(argv);
679 _Py_FreeCharPArray(exec_array);
680 Py_XDECREF(converted_args);
Gregory P. Smith68f52172010-03-15 06:07:42 +0000681 Py_XDECREF(fast_args);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000682 Py_XDECREF(preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000683
684 /* Reenable gc if it was disabled. */
685 if (need_to_reenable_gc)
686 _enable_gc(gc_module);
687 Py_XDECREF(gc_module);
688 return NULL;
689}
690
691
692PyDoc_STRVAR(subprocess_fork_exec_doc,
693"fork_exec(args, executable_list, close_fds, cwd, env,\n\
694 p2cread, p2cwrite, c2pread, c2pwrite,\n\
695 errread, errwrite, errpipe_read, errpipe_write,\n\
696 restore_signals, call_setsid, preexec_fn)\n\
697\n\
698Forks a child process, closes parent file descriptors as appropriate in the\n\
699child and dups the few that are needed before calling exec() in the child\n\
700process.\n\
701\n\
702The preexec_fn, if supplied, will be called immediately before exec.\n\
703WARNING: preexec_fn is NOT SAFE if your application uses threads.\n\
704 It may trigger infrequent, difficult to debug deadlocks.\n\
705\n\
706If an error occurs in the child process before the exec, it is\n\
707serialized and written to the errpipe_write fd per subprocess.py.\n\
708\n\
709Returns: the child process's PID.\n\
710\n\
711Raises: Only on an error in the parent process.\n\
712");
713
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000714PyDoc_STRVAR(subprocess_cloexec_pipe_doc,
715"cloexec_pipe() -> (read_end, write_end)\n\n\
716Create a pipe whose ends have the cloexec flag set.");
717
718static PyObject *
719subprocess_cloexec_pipe(PyObject *self, PyObject *noargs)
720{
721 int fds[2];
722 int res;
723#ifdef HAVE_PIPE2
724 Py_BEGIN_ALLOW_THREADS
725 res = pipe2(fds, O_CLOEXEC);
726 Py_END_ALLOW_THREADS
Gregory P. Smithabcfcba2011-01-02 20:52:48 +0000727 if (res != 0 && errno == ENOSYS)
728 {
Gregory P. Smithabcfcba2011-01-02 20:52:48 +0000729 {
730#endif
731 /* We hold the GIL which offers some protection from other code calling
732 * fork() before the CLOEXEC flags have been set but we can't guarantee
733 * anything without pipe2(). */
734 long oldflags;
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000735
Gregory P. Smithabcfcba2011-01-02 20:52:48 +0000736 res = pipe(fds);
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000737
Gregory P. Smithabcfcba2011-01-02 20:52:48 +0000738 if (res == 0) {
739 oldflags = fcntl(fds[0], F_GETFD, 0);
740 if (oldflags < 0) res = oldflags;
741 }
742 if (res == 0)
743 res = fcntl(fds[0], F_SETFD, oldflags | FD_CLOEXEC);
744
745 if (res == 0) {
746 oldflags = fcntl(fds[1], F_GETFD, 0);
747 if (oldflags < 0) res = oldflags;
748 }
749 if (res == 0)
750 res = fcntl(fds[1], F_SETFD, oldflags | FD_CLOEXEC);
751#ifdef HAVE_PIPE2
752 }
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000753 }
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000754#endif
755 if (res != 0)
756 return PyErr_SetFromErrno(PyExc_OSError);
757 return Py_BuildValue("(ii)", fds[0], fds[1]);
758}
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000759
760/* module level code ********************************************************/
761
762PyDoc_STRVAR(module_doc,
763"A POSIX helper for the subprocess module.");
764
765
766static PyMethodDef module_methods[] = {
767 {"fork_exec", subprocess_fork_exec, METH_VARARGS, subprocess_fork_exec_doc},
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000768 {"cloexec_pipe", subprocess_cloexec_pipe, METH_NOARGS, subprocess_cloexec_pipe_doc},
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000769 {NULL, NULL} /* sentinel */
770};
771
772
773static struct PyModuleDef _posixsubprocessmodule = {
774 PyModuleDef_HEAD_INIT,
775 "_posixsubprocess",
776 module_doc,
777 -1, /* No memory is needed. */
778 module_methods,
779};
780
781PyMODINIT_FUNC
782PyInit__posixsubprocess(void)
783{
784#ifdef _SC_OPEN_MAX
785 max_fd = sysconf(_SC_OPEN_MAX);
786 if (max_fd == -1)
787#endif
788 max_fd = 256; /* Matches Lib/subprocess.py */
789
790 return PyModule_Create(&_posixsubprocessmodule);
791}