blob: ed2dd58796e3428081c06664ed2b96498b0811fe [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 {
Gregory P. Smith58f07a92012-06-05 13:26:39 -0700180#if defined(__x86_64__) && defined(__ILP32__)
181 /* Support the wacky x32 ABI (fake 32-bit userspace speaking to x86_64
182 * kernel interfaces) - https://sites.google.com/site/x32abi/ */
183 unsigned long long d_ino;
184 unsigned long long d_off;
185#else
Gregory P. Smith8facece2012-01-21 14:01:08 -0800186 unsigned long d_ino; /* Inode number */
187 unsigned long d_off; /* Offset to next linux_dirent */
Gregory P. Smith58f07a92012-06-05 13:26:39 -0700188#endif
Gregory P. Smith8facece2012-01-21 14:01:08 -0800189 unsigned short d_reclen; /* Length of this linux_dirent */
190 char d_name[256]; /* Filename (null-terminated) */
191};
192
193/* Close all open file descriptors in the range start_fd inclusive to end_fd
194 * exclusive. Do not close any in the sorted py_fds_to_keep list.
195 *
196 * This version is async signal safe as it does not make any unsafe C library
197 * calls, malloc calls or handle any locks. It is _unfortunate_ to be forced
198 * to resort to making a kernel system call directly but this is the ONLY api
199 * available that does no harm. opendir/readdir/closedir perform memory
200 * allocation and locking so while they usually work they are not guaranteed
201 * to (especially if you have replaced your malloc implementation). A version
202 * of this function that uses those can be found in the _maybe_unsafe variant.
203 *
204 * This is Linux specific because that is all I am ready to test it on. It
205 * should be easy to add OS specific dirent or dirent64 structures and modify
206 * it with some cpp #define magic to work on other OSes as well if you want.
207 */
Benjamin Peterson91eef982012-01-22 20:04:46 -0500208static void
209_close_open_fd_range_safe(int start_fd, int end_fd, PyObject* py_fds_to_keep)
Gregory P. Smith8facece2012-01-21 14:01:08 -0800210{
211 int fd_dir_fd;
212 if (start_fd >= end_fd)
213 return;
Ross Lagerwall5802fdf2012-03-18 15:55:10 +0200214#ifdef O_CLOEXEC
215 fd_dir_fd = open(FD_DIR, O_RDONLY | O_CLOEXEC, 0);
216#else
217 fd_dir_fd = open(FD_DIR, O_RDONLY, 0);
218#ifdef FD_CLOEXEC
219 {
220 int old = fcntl(fd_dir_fd, F_GETFD);
221 if (old != -1)
222 fcntl(fd_dir_fd, F_SETFD, old | FD_CLOEXEC);
223 }
224#endif
225#endif
Gregory P. Smith8facece2012-01-21 14:01:08 -0800226 if (fd_dir_fd == -1) {
227 /* No way to get a list of open fds. */
228 _close_fds_by_brute_force(start_fd, end_fd, py_fds_to_keep);
229 return;
230 } else {
231 char buffer[sizeof(struct linux_dirent)];
232 int bytes;
233 while ((bytes = syscall(SYS_getdents, fd_dir_fd,
234 (struct linux_dirent *)buffer,
235 sizeof(buffer))) > 0) {
236 struct linux_dirent *entry;
237 int offset;
238 for (offset = 0; offset < bytes; offset += entry->d_reclen) {
239 int fd;
240 entry = (struct linux_dirent *)(buffer + offset);
241 if ((fd = _pos_int_from_ascii(entry->d_name)) < 0)
242 continue; /* Not a number. */
243 if (fd != fd_dir_fd && fd >= start_fd && fd < end_fd &&
244 !_is_fd_in_sorted_fd_sequence(fd, py_fds_to_keep)) {
245 while (close(fd) < 0 && errno == EINTR);
246 }
247 }
248 }
249 close(fd_dir_fd);
250 }
251}
252
253#define _close_open_fd_range _close_open_fd_range_safe
254
255#else /* NOT (defined(__linux__) && defined(HAVE_SYS_SYSCALL_H)) */
256
257
258/* Close all open file descriptors in the range start_fd inclusive to end_fd
259 * exclusive. Do not close any in the sorted py_fds_to_keep list.
260 *
261 * This function violates the strict use of async signal safe functions. :(
Gregory P. Smithe3f78482012-01-21 15:16:17 -0800262 * It calls opendir(), readdir() and closedir(). Of these, the one most
Gregory P. Smith8facece2012-01-21 14:01:08 -0800263 * likely to ever cause a problem is opendir() as it performs an internal
264 * malloc(). Practically this should not be a problem. The Java VM makes the
265 * same calls between fork and exec in its own UNIXProcess_md.c implementation.
266 *
267 * readdir_r() is not used because it provides no benefit. It is typically
268 * implemented as readdir() followed by memcpy(). See also:
269 * http://womble.decadent.org.uk/readdir_r-advisory.html
270 */
Benjamin Peterson91eef982012-01-22 20:04:46 -0500271static void
272_close_open_fd_range_maybe_unsafe(int start_fd, int end_fd,
273 PyObject* py_fds_to_keep)
Gregory P. Smith8facece2012-01-21 14:01:08 -0800274{
275 DIR *proc_fd_dir;
276#ifndef HAVE_DIRFD
277 while (_is_fd_in_sorted_fd_sequence(start_fd, py_fds_to_keep) &&
278 (start_fd < end_fd)) {
279 ++start_fd;
280 }
281 if (start_fd >= end_fd)
282 return;
283 /* Close our lowest fd before we call opendir so that it is likely to
284 * reuse that fd otherwise we might close opendir's file descriptor in
285 * our loop. This trick assumes that fd's are allocated on a lowest
286 * available basis. */
287 while (close(start_fd) < 0 && errno == EINTR);
288 ++start_fd;
289#endif
290 if (start_fd >= end_fd)
291 return;
292
Gregory P. Smith4842efc2012-01-21 21:01:24 -0800293#if defined(__FreeBSD__)
294 if (!_is_fdescfs_mounted_on_dev_fd())
295 proc_fd_dir = NULL;
296 else
297#endif
298 proc_fd_dir = opendir(FD_DIR);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800299 if (!proc_fd_dir) {
300 /* No way to get a list of open fds. */
301 _close_fds_by_brute_force(start_fd, end_fd, py_fds_to_keep);
302 } else {
Gregory P. Smithe3f78482012-01-21 15:16:17 -0800303 struct dirent *dir_entry;
Gregory P. Smith8facece2012-01-21 14:01:08 -0800304#ifdef HAVE_DIRFD
Gregory P. Smithe9b7cab2012-01-21 15:19:11 -0800305 int fd_used_by_opendir = dirfd(proc_fd_dir);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800306#else
307 int fd_used_by_opendir = start_fd - 1;
308#endif
309 errno = 0;
Gregory P. Smithe3f78482012-01-21 15:16:17 -0800310 while ((dir_entry = readdir(proc_fd_dir))) {
Gregory P. Smith8facece2012-01-21 14:01:08 -0800311 int fd;
312 if ((fd = _pos_int_from_ascii(dir_entry->d_name)) < 0)
313 continue; /* Not a number. */
314 if (fd != fd_used_by_opendir && fd >= start_fd && fd < end_fd &&
315 !_is_fd_in_sorted_fd_sequence(fd, py_fds_to_keep)) {
316 while (close(fd) < 0 && errno == EINTR);
317 }
318 errno = 0;
319 }
320 if (errno) {
321 /* readdir error, revert behavior. Highly Unlikely. */
322 _close_fds_by_brute_force(start_fd, end_fd, py_fds_to_keep);
323 }
324 closedir(proc_fd_dir);
325 }
326}
327
328#define _close_open_fd_range _close_open_fd_range_maybe_unsafe
329
330#endif /* else NOT (defined(__linux__) && defined(HAVE_SYS_SYSCALL_H)) */
331
332
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000333/*
334 * This function is code executed in the child process immediately after fork
335 * to set things up and call exec().
336 *
337 * All of the code in this function must only use async-signal-safe functions,
338 * listed at `man 7 signal` or
339 * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
340 *
341 * This restriction is documented at
342 * http://www.opengroup.org/onlinepubs/009695399/functions/fork.html.
343 */
Benjamin Peterson91eef982012-01-22 20:04:46 -0500344static void
345child_exec(char *const exec_array[],
346 char *const argv[],
347 char *const envp[],
348 const char *cwd,
349 int p2cread, int p2cwrite,
350 int c2pread, int c2pwrite,
351 int errread, int errwrite,
352 int errpipe_read, int errpipe_write,
353 int close_fds, int restore_signals,
354 int call_setsid,
355 PyObject *py_fds_to_keep,
356 PyObject *preexec_fn,
357 PyObject *preexec_fn_args_tuple)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000358{
Gregory P. Smith8facece2012-01-21 14:01:08 -0800359 int i, saved_errno, unused;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000360 PyObject *result;
Gregory P. Smith14affb82010-12-22 05:22:17 +0000361 const char* err_msg = "";
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000362 /* Buffer large enough to hold a hex integer. We can't malloc. */
363 char hex_errno[sizeof(saved_errno)*2+1];
364
365 /* Close parent's pipe ends. */
366 if (p2cwrite != -1) {
367 POSIX_CALL(close(p2cwrite));
368 }
369 if (c2pread != -1) {
370 POSIX_CALL(close(c2pread));
371 }
372 if (errread != -1) {
373 POSIX_CALL(close(errread));
374 }
375 POSIX_CALL(close(errpipe_read));
376
Ross Lagerwalld98646e2011-07-27 07:16:31 +0200377 /* When duping fds, if there arises a situation where one of the fds is
378 either 0, 1 or 2, it is possible that it is overwritten (#12607). */
379 if (c2pwrite == 0)
380 POSIX_CALL(c2pwrite = dup(c2pwrite));
381 if (errwrite == 0 || errwrite == 1)
382 POSIX_CALL(errwrite = dup(errwrite));
383
Antoine Pitrouc9c83ba2011-01-03 18:23:55 +0000384 /* Dup fds for child.
385 dup2() removes the CLOEXEC flag but we must do it ourselves if dup2()
386 would be a no-op (issue #10806). */
387 if (p2cread == 0) {
388 int old = fcntl(p2cread, F_GETFD);
389 if (old != -1)
390 fcntl(p2cread, F_SETFD, old & ~FD_CLOEXEC);
391 } else if (p2cread != -1) {
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000392 POSIX_CALL(dup2(p2cread, 0)); /* stdin */
393 }
Antoine Pitrouc9c83ba2011-01-03 18:23:55 +0000394 if (c2pwrite == 1) {
395 int old = fcntl(c2pwrite, F_GETFD);
396 if (old != -1)
397 fcntl(c2pwrite, F_SETFD, old & ~FD_CLOEXEC);
398 } else if (c2pwrite != -1) {
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000399 POSIX_CALL(dup2(c2pwrite, 1)); /* stdout */
400 }
Antoine Pitrouc9c83ba2011-01-03 18:23:55 +0000401 if (errwrite == 2) {
402 int old = fcntl(errwrite, F_GETFD);
403 if (old != -1)
404 fcntl(errwrite, F_SETFD, old & ~FD_CLOEXEC);
405 } else if (errwrite != -1) {
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000406 POSIX_CALL(dup2(errwrite, 2)); /* stderr */
407 }
408
409 /* Close pipe fds. Make sure we don't close the same fd more than */
410 /* once, or standard fds. */
Antoine Pitrouc9c83ba2011-01-03 18:23:55 +0000411 if (p2cread > 2) {
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000412 POSIX_CALL(close(p2cread));
413 }
Gregory P. Smith81218982011-03-15 14:56:39 -0400414 if (c2pwrite > 2 && c2pwrite != p2cread) {
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000415 POSIX_CALL(close(c2pwrite));
416 }
Gregory P. Smith81218982011-03-15 14:56:39 -0400417 if (errwrite != c2pwrite && errwrite != p2cread && errwrite > 2) {
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000418 POSIX_CALL(close(errwrite));
419 }
420
Gregory P. Smith4842efc2012-01-21 21:01:24 -0800421 if (close_fds) {
422 int local_max_fd = max_fd;
423#if defined(__NetBSD__)
424 local_max_fd = fcntl(0, F_MAXFD);
425 if (local_max_fd < 0)
426 local_max_fd = max_fd;
427#endif
428 /* TODO HP-UX could use pstat_getproc() if anyone cares about it. */
429 _close_open_fd_range(3, local_max_fd, py_fds_to_keep);
430 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000431
432 if (cwd)
433 POSIX_CALL(chdir(cwd));
434
435 if (restore_signals)
436 _Py_RestoreSignals();
437
438#ifdef HAVE_SETSID
439 if (call_setsid)
440 POSIX_CALL(setsid());
441#endif
442
443 if (preexec_fn != Py_None && preexec_fn_args_tuple) {
444 /* This is where the user has asked us to deadlock their program. */
445 result = PyObject_Call(preexec_fn, preexec_fn_args_tuple, NULL);
446 if (result == NULL) {
447 /* Stringifying the exception or traceback would involve
448 * memory allocation and thus potential for deadlock.
449 * We've already faced potential deadlock by calling back
450 * into Python in the first place, so it probably doesn't
451 * matter but we avoid it to minimize the possibility. */
452 err_msg = "Exception occurred in preexec_fn.";
453 errno = 0; /* We don't want to report an OSError. */
454 goto error;
455 }
456 /* Py_DECREF(result); - We're about to exec so why bother? */
457 }
458
459 /* This loop matches the Lib/os.py _execvpe()'s PATH search when */
460 /* given the executable_list generated by Lib/subprocess.py. */
461 saved_errno = 0;
462 for (i = 0; exec_array[i] != NULL; ++i) {
463 const char *executable = exec_array[i];
464 if (envp) {
465 execve(executable, argv, envp);
466 } else {
467 execv(executable, argv);
468 }
469 if (errno != ENOENT && errno != ENOTDIR && saved_errno == 0) {
470 saved_errno = errno;
471 }
472 }
473 /* Report the first exec error, not the last. */
474 if (saved_errno)
475 errno = saved_errno;
476
477error:
478 saved_errno = errno;
479 /* Report the posix error to our parent process. */
Gregory P. Smith12fdca52012-01-21 12:31:25 -0800480 /* We ignore all write() return values as the total size of our writes is
481 * less than PIPEBUF and we cannot do anything about an error anyways. */
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000482 if (saved_errno) {
483 char *cur;
Gregory P. Smith12fdca52012-01-21 12:31:25 -0800484 unused = write(errpipe_write, "OSError:", 8);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000485 cur = hex_errno + sizeof(hex_errno);
486 while (saved_errno != 0 && cur > hex_errno) {
487 *--cur = "0123456789ABCDEF"[saved_errno % 16];
488 saved_errno /= 16;
489 }
Gregory P. Smith12fdca52012-01-21 12:31:25 -0800490 unused = write(errpipe_write, cur, hex_errno + sizeof(hex_errno) - cur);
491 unused = write(errpipe_write, ":", 1);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000492 /* We can't call strerror(saved_errno). It is not async signal safe.
493 * The parent process will look the error message up. */
494 } else {
Gregory P. Smith12fdca52012-01-21 12:31:25 -0800495 unused = write(errpipe_write, "RuntimeError:0:", 15);
496 unused = write(errpipe_write, err_msg, strlen(err_msg));
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000497 }
Gregory P. Smith12fdca52012-01-21 12:31:25 -0800498 if (unused) return; /* silly? yes! avoids gcc compiler warning. */
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000499}
500
501
502static PyObject *
503subprocess_fork_exec(PyObject* self, PyObject *args)
504{
505 PyObject *gc_module = NULL;
Antoine Pitrou721738f2012-08-15 23:20:39 +0200506 PyObject *executable_list, *py_fds_to_keep;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000507 PyObject *env_list, *preexec_fn;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000508 PyObject *process_args, *converted_args = NULL, *fast_args = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000509 PyObject *preexec_fn_args_tuple = NULL;
510 int p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite;
511 int errpipe_read, errpipe_write, close_fds, restore_signals;
512 int call_setsid;
Victor Stinner0e59cc32010-04-16 23:49:32 +0000513 PyObject *cwd_obj, *cwd_obj2;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000514 const char *cwd;
515 pid_t pid;
516 int need_to_reenable_gc = 0;
517 char *const *exec_array, *const *argv = NULL, *const *envp = NULL;
Gregory P. Smith8facece2012-01-21 14:01:08 -0800518 Py_ssize_t arg_num;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000519
520 if (!PyArg_ParseTuple(
Antoine Pitrou721738f2012-08-15 23:20:39 +0200521 args, "OOpOOOiiiiiiiiiiO:fork_exec",
522 &process_args, &executable_list, &close_fds, &py_fds_to_keep,
Victor Stinner0e59cc32010-04-16 23:49:32 +0000523 &cwd_obj, &env_list,
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000524 &p2cread, &p2cwrite, &c2pread, &c2pwrite,
525 &errread, &errwrite, &errpipe_read, &errpipe_write,
526 &restore_signals, &call_setsid, &preexec_fn))
527 return NULL;
528
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000529 if (close_fds && errpipe_write < 3) { /* precondition */
530 PyErr_SetString(PyExc_ValueError, "errpipe_write must be >= 3");
531 return NULL;
532 }
Gregory P. Smith8facece2012-01-21 14:01:08 -0800533 if (PySequence_Length(py_fds_to_keep) < 0) {
534 PyErr_SetString(PyExc_ValueError, "cannot get length of fds_to_keep");
535 return NULL;
536 }
537 if (_sanity_check_python_fd_sequence(py_fds_to_keep)) {
538 PyErr_SetString(PyExc_ValueError, "bad value(s) in fds_to_keep");
Gregory P. Smithd4cc7bf2010-12-04 11:22:11 +0000539 return NULL;
540 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000541
542 /* We need to call gc.disable() when we'll be calling preexec_fn */
543 if (preexec_fn != Py_None) {
544 PyObject *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200545 _Py_IDENTIFIER(isenabled);
546 _Py_IDENTIFIER(disable);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200547
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000548 gc_module = PyImport_ImportModule("gc");
549 if (gc_module == NULL)
550 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200551 result = _PyObject_CallMethodId(gc_module, &PyId_isenabled, NULL);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000552 if (result == NULL) {
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 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000556 need_to_reenable_gc = PyObject_IsTrue(result);
557 Py_DECREF(result);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000558 if (need_to_reenable_gc == -1) {
559 Py_DECREF(gc_module);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000560 return NULL;
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000561 }
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200562 result = _PyObject_CallMethodId(gc_module, &PyId_disable, NULL);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000563 if (result == NULL) {
564 Py_DECREF(gc_module);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000565 return NULL;
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000566 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000567 Py_DECREF(result);
568 }
569
570 exec_array = _PySequence_BytesToCharpArray(executable_list);
571 if (!exec_array)
572 return NULL;
573
574 /* Convert args and env into appropriate arguments for exec() */
575 /* These conversions are done in the parent process to avoid allocating
576 or freeing memory in the child process. */
577 if (process_args != Py_None) {
Gregory P. Smith68f52172010-03-15 06:07:42 +0000578 Py_ssize_t num_args;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000579 /* Equivalent to: */
580 /* tuple(PyUnicode_FSConverter(arg) for arg in process_args) */
Gregory P. Smith68f52172010-03-15 06:07:42 +0000581 fast_args = PySequence_Fast(process_args, "argv must be a tuple");
582 num_args = PySequence_Fast_GET_SIZE(fast_args);
583 converted_args = PyTuple_New(num_args);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000584 if (converted_args == NULL)
585 goto cleanup;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000586 for (arg_num = 0; arg_num < num_args; ++arg_num) {
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000587 PyObject *borrowed_arg, *converted_arg;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000588 borrowed_arg = PySequence_Fast_GET_ITEM(fast_args, arg_num);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000589 if (PyUnicode_FSConverter(borrowed_arg, &converted_arg) == 0)
590 goto cleanup;
591 PyTuple_SET_ITEM(converted_args, arg_num, converted_arg);
592 }
593
594 argv = _PySequence_BytesToCharpArray(converted_args);
595 Py_CLEAR(converted_args);
Gregory P. Smith68f52172010-03-15 06:07:42 +0000596 Py_CLEAR(fast_args);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000597 if (!argv)
598 goto cleanup;
599 }
600
601 if (env_list != Py_None) {
602 envp = _PySequence_BytesToCharpArray(env_list);
603 if (!envp)
604 goto cleanup;
605 }
606
607 if (preexec_fn != Py_None) {
608 preexec_fn_args_tuple = PyTuple_New(0);
609 if (!preexec_fn_args_tuple)
610 goto cleanup;
Victor Stinner0e59cc32010-04-16 23:49:32 +0000611 _PyImport_AcquireLock();
612 }
613
614 if (cwd_obj != Py_None) {
615 if (PyUnicode_FSConverter(cwd_obj, &cwd_obj2) == 0)
616 goto cleanup;
Victor Stinnerdcb24032010-04-22 12:08:36 +0000617 cwd = PyBytes_AsString(cwd_obj2);
Victor Stinner0e59cc32010-04-16 23:49:32 +0000618 } else {
619 cwd = NULL;
620 cwd_obj2 = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000621 }
622
623 pid = fork();
624 if (pid == 0) {
625 /* Child process */
Victor Stinner0e59cc32010-04-16 23:49:32 +0000626 /*
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000627 * Code from here to _exit() must only use async-signal-safe functions,
628 * listed at `man 7 signal` or
629 * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
630 */
631
632 if (preexec_fn != Py_None) {
633 /* We'll be calling back into Python later so we need to do this.
634 * This call may not be async-signal-safe but neither is calling
635 * back into Python. The user asked us to use hope as a strategy
636 * to avoid deadlock... */
637 PyOS_AfterFork();
638 }
639
640 child_exec(exec_array, argv, envp, cwd,
641 p2cread, p2cwrite, c2pread, c2pwrite,
642 errread, errwrite, errpipe_read, errpipe_write,
643 close_fds, restore_signals, call_setsid,
Gregory P. Smith8facece2012-01-21 14:01:08 -0800644 py_fds_to_keep, preexec_fn, preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000645 _exit(255);
646 return NULL; /* Dead code to avoid a potential compiler warning. */
647 }
Victor Stinner0e59cc32010-04-16 23:49:32 +0000648 Py_XDECREF(cwd_obj2);
649
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000650 if (pid == -1) {
651 /* Capture the errno exception before errno can be clobbered. */
652 PyErr_SetFromErrno(PyExc_OSError);
653 }
654 if (preexec_fn != Py_None &&
655 _PyImport_ReleaseLock() < 0 && !PyErr_Occurred()) {
656 PyErr_SetString(PyExc_RuntimeError,
657 "not holding the import lock");
658 }
659
660 /* Parent process */
661 if (envp)
662 _Py_FreeCharPArray(envp);
663 if (argv)
664 _Py_FreeCharPArray(argv);
665 _Py_FreeCharPArray(exec_array);
666
667 /* Reenable gc in the parent process (or if fork failed). */
668 if (need_to_reenable_gc && _enable_gc(gc_module)) {
669 Py_XDECREF(gc_module);
670 return NULL;
671 }
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000672 Py_XDECREF(preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000673 Py_XDECREF(gc_module);
674
675 if (pid == -1)
676 return NULL; /* fork() failed. Exception set earlier. */
677
678 return PyLong_FromPid(pid);
679
680cleanup:
681 if (envp)
682 _Py_FreeCharPArray(envp);
683 if (argv)
684 _Py_FreeCharPArray(argv);
685 _Py_FreeCharPArray(exec_array);
686 Py_XDECREF(converted_args);
Gregory P. Smith68f52172010-03-15 06:07:42 +0000687 Py_XDECREF(fast_args);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000688 Py_XDECREF(preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000689
690 /* Reenable gc if it was disabled. */
691 if (need_to_reenable_gc)
692 _enable_gc(gc_module);
693 Py_XDECREF(gc_module);
694 return NULL;
695}
696
697
698PyDoc_STRVAR(subprocess_fork_exec_doc,
699"fork_exec(args, executable_list, close_fds, cwd, env,\n\
700 p2cread, p2cwrite, c2pread, c2pwrite,\n\
701 errread, errwrite, errpipe_read, errpipe_write,\n\
702 restore_signals, call_setsid, preexec_fn)\n\
703\n\
704Forks a child process, closes parent file descriptors as appropriate in the\n\
705child and dups the few that are needed before calling exec() in the child\n\
706process.\n\
707\n\
708The preexec_fn, if supplied, will be called immediately before exec.\n\
709WARNING: preexec_fn is NOT SAFE if your application uses threads.\n\
710 It may trigger infrequent, difficult to debug deadlocks.\n\
711\n\
712If an error occurs in the child process before the exec, it is\n\
713serialized and written to the errpipe_write fd per subprocess.py.\n\
714\n\
715Returns: the child process's PID.\n\
716\n\
717Raises: Only on an error in the parent process.\n\
718");
719
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000720PyDoc_STRVAR(subprocess_cloexec_pipe_doc,
721"cloexec_pipe() -> (read_end, write_end)\n\n\
722Create a pipe whose ends have the cloexec flag set.");
723
724static PyObject *
725subprocess_cloexec_pipe(PyObject *self, PyObject *noargs)
726{
727 int fds[2];
728 int res;
729#ifdef HAVE_PIPE2
730 Py_BEGIN_ALLOW_THREADS
731 res = pipe2(fds, O_CLOEXEC);
732 Py_END_ALLOW_THREADS
Gregory P. Smithabcfcba2011-01-02 20:52:48 +0000733 if (res != 0 && errno == ENOSYS)
734 {
Gregory P. Smithabcfcba2011-01-02 20:52:48 +0000735 {
736#endif
737 /* We hold the GIL which offers some protection from other code calling
738 * fork() before the CLOEXEC flags have been set but we can't guarantee
739 * anything without pipe2(). */
740 long oldflags;
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000741
Gregory P. Smithabcfcba2011-01-02 20:52:48 +0000742 res = pipe(fds);
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000743
Gregory P. Smithabcfcba2011-01-02 20:52:48 +0000744 if (res == 0) {
745 oldflags = fcntl(fds[0], F_GETFD, 0);
746 if (oldflags < 0) res = oldflags;
747 }
748 if (res == 0)
749 res = fcntl(fds[0], F_SETFD, oldflags | FD_CLOEXEC);
750
751 if (res == 0) {
752 oldflags = fcntl(fds[1], F_GETFD, 0);
753 if (oldflags < 0) res = oldflags;
754 }
755 if (res == 0)
756 res = fcntl(fds[1], F_SETFD, oldflags | FD_CLOEXEC);
757#ifdef HAVE_PIPE2
758 }
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000759 }
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000760#endif
761 if (res != 0)
762 return PyErr_SetFromErrno(PyExc_OSError);
763 return Py_BuildValue("(ii)", fds[0], fds[1]);
764}
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000765
766/* module level code ********************************************************/
767
768PyDoc_STRVAR(module_doc,
769"A POSIX helper for the subprocess module.");
770
771
772static PyMethodDef module_methods[] = {
773 {"fork_exec", subprocess_fork_exec, METH_VARARGS, subprocess_fork_exec_doc},
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000774 {"cloexec_pipe", subprocess_cloexec_pipe, METH_NOARGS, subprocess_cloexec_pipe_doc},
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000775 {NULL, NULL} /* sentinel */
776};
777
778
779static struct PyModuleDef _posixsubprocessmodule = {
780 PyModuleDef_HEAD_INIT,
781 "_posixsubprocess",
782 module_doc,
783 -1, /* No memory is needed. */
784 module_methods,
785};
786
787PyMODINIT_FUNC
788PyInit__posixsubprocess(void)
789{
790#ifdef _SC_OPEN_MAX
791 max_fd = sysconf(_SC_OPEN_MAX);
792 if (max_fd == -1)
793#endif
794 max_fd = 256; /* Matches Lib/subprocess.py */
795
796 return PyModule_Create(&_posixsubprocessmodule);
797}