blob: b8fb72f62e61a84017139f389c335c2d402707c3 [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");
Stefan Krahdb579d72012-08-20 14:36:47 +0200582 if (fast_args == NULL)
583 goto cleanup;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000584 num_args = PySequence_Fast_GET_SIZE(fast_args);
585 converted_args = PyTuple_New(num_args);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000586 if (converted_args == NULL)
587 goto cleanup;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000588 for (arg_num = 0; arg_num < num_args; ++arg_num) {
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000589 PyObject *borrowed_arg, *converted_arg;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000590 borrowed_arg = PySequence_Fast_GET_ITEM(fast_args, arg_num);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000591 if (PyUnicode_FSConverter(borrowed_arg, &converted_arg) == 0)
592 goto cleanup;
593 PyTuple_SET_ITEM(converted_args, arg_num, converted_arg);
594 }
595
596 argv = _PySequence_BytesToCharpArray(converted_args);
597 Py_CLEAR(converted_args);
Gregory P. Smith68f52172010-03-15 06:07:42 +0000598 Py_CLEAR(fast_args);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000599 if (!argv)
600 goto cleanup;
601 }
602
603 if (env_list != Py_None) {
604 envp = _PySequence_BytesToCharpArray(env_list);
605 if (!envp)
606 goto cleanup;
607 }
608
609 if (preexec_fn != Py_None) {
610 preexec_fn_args_tuple = PyTuple_New(0);
611 if (!preexec_fn_args_tuple)
612 goto cleanup;
Victor Stinner0e59cc32010-04-16 23:49:32 +0000613 _PyImport_AcquireLock();
614 }
615
616 if (cwd_obj != Py_None) {
617 if (PyUnicode_FSConverter(cwd_obj, &cwd_obj2) == 0)
618 goto cleanup;
Victor Stinnerdcb24032010-04-22 12:08:36 +0000619 cwd = PyBytes_AsString(cwd_obj2);
Victor Stinner0e59cc32010-04-16 23:49:32 +0000620 } else {
621 cwd = NULL;
622 cwd_obj2 = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000623 }
624
625 pid = fork();
626 if (pid == 0) {
627 /* Child process */
Victor Stinner0e59cc32010-04-16 23:49:32 +0000628 /*
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000629 * Code from here to _exit() must only use async-signal-safe functions,
630 * listed at `man 7 signal` or
631 * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
632 */
633
634 if (preexec_fn != Py_None) {
635 /* We'll be calling back into Python later so we need to do this.
636 * This call may not be async-signal-safe but neither is calling
637 * back into Python. The user asked us to use hope as a strategy
638 * to avoid deadlock... */
639 PyOS_AfterFork();
640 }
641
642 child_exec(exec_array, argv, envp, cwd,
643 p2cread, p2cwrite, c2pread, c2pwrite,
644 errread, errwrite, errpipe_read, errpipe_write,
645 close_fds, restore_signals, call_setsid,
Gregory P. Smith8facece2012-01-21 14:01:08 -0800646 py_fds_to_keep, preexec_fn, preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000647 _exit(255);
648 return NULL; /* Dead code to avoid a potential compiler warning. */
649 }
Victor Stinner0e59cc32010-04-16 23:49:32 +0000650 Py_XDECREF(cwd_obj2);
651
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000652 if (pid == -1) {
653 /* Capture the errno exception before errno can be clobbered. */
654 PyErr_SetFromErrno(PyExc_OSError);
655 }
656 if (preexec_fn != Py_None &&
657 _PyImport_ReleaseLock() < 0 && !PyErr_Occurred()) {
658 PyErr_SetString(PyExc_RuntimeError,
659 "not holding the import lock");
660 }
661
662 /* Parent process */
663 if (envp)
664 _Py_FreeCharPArray(envp);
665 if (argv)
666 _Py_FreeCharPArray(argv);
667 _Py_FreeCharPArray(exec_array);
668
669 /* Reenable gc in the parent process (or if fork failed). */
670 if (need_to_reenable_gc && _enable_gc(gc_module)) {
671 Py_XDECREF(gc_module);
672 return NULL;
673 }
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000674 Py_XDECREF(preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000675 Py_XDECREF(gc_module);
676
677 if (pid == -1)
678 return NULL; /* fork() failed. Exception set earlier. */
679
680 return PyLong_FromPid(pid);
681
682cleanup:
683 if (envp)
684 _Py_FreeCharPArray(envp);
685 if (argv)
686 _Py_FreeCharPArray(argv);
687 _Py_FreeCharPArray(exec_array);
688 Py_XDECREF(converted_args);
Gregory P. Smith68f52172010-03-15 06:07:42 +0000689 Py_XDECREF(fast_args);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000690 Py_XDECREF(preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000691
692 /* Reenable gc if it was disabled. */
693 if (need_to_reenable_gc)
694 _enable_gc(gc_module);
695 Py_XDECREF(gc_module);
696 return NULL;
697}
698
699
700PyDoc_STRVAR(subprocess_fork_exec_doc,
701"fork_exec(args, executable_list, close_fds, cwd, env,\n\
702 p2cread, p2cwrite, c2pread, c2pwrite,\n\
703 errread, errwrite, errpipe_read, errpipe_write,\n\
704 restore_signals, call_setsid, preexec_fn)\n\
705\n\
706Forks a child process, closes parent file descriptors as appropriate in the\n\
707child and dups the few that are needed before calling exec() in the child\n\
708process.\n\
709\n\
710The preexec_fn, if supplied, will be called immediately before exec.\n\
711WARNING: preexec_fn is NOT SAFE if your application uses threads.\n\
712 It may trigger infrequent, difficult to debug deadlocks.\n\
713\n\
714If an error occurs in the child process before the exec, it is\n\
715serialized and written to the errpipe_write fd per subprocess.py.\n\
716\n\
717Returns: the child process's PID.\n\
718\n\
719Raises: Only on an error in the parent process.\n\
720");
721
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000722PyDoc_STRVAR(subprocess_cloexec_pipe_doc,
723"cloexec_pipe() -> (read_end, write_end)\n\n\
724Create a pipe whose ends have the cloexec flag set.");
725
726static PyObject *
727subprocess_cloexec_pipe(PyObject *self, PyObject *noargs)
728{
729 int fds[2];
730 int res;
731#ifdef HAVE_PIPE2
732 Py_BEGIN_ALLOW_THREADS
733 res = pipe2(fds, O_CLOEXEC);
734 Py_END_ALLOW_THREADS
Gregory P. Smithabcfcba2011-01-02 20:52:48 +0000735 if (res != 0 && errno == ENOSYS)
736 {
Gregory P. Smithabcfcba2011-01-02 20:52:48 +0000737 {
738#endif
739 /* We hold the GIL which offers some protection from other code calling
740 * fork() before the CLOEXEC flags have been set but we can't guarantee
741 * anything without pipe2(). */
742 long oldflags;
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000743
Gregory P. Smithabcfcba2011-01-02 20:52:48 +0000744 res = pipe(fds);
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000745
Gregory P. Smithabcfcba2011-01-02 20:52:48 +0000746 if (res == 0) {
747 oldflags = fcntl(fds[0], F_GETFD, 0);
748 if (oldflags < 0) res = oldflags;
749 }
750 if (res == 0)
751 res = fcntl(fds[0], F_SETFD, oldflags | FD_CLOEXEC);
752
753 if (res == 0) {
754 oldflags = fcntl(fds[1], F_GETFD, 0);
755 if (oldflags < 0) res = oldflags;
756 }
757 if (res == 0)
758 res = fcntl(fds[1], F_SETFD, oldflags | FD_CLOEXEC);
759#ifdef HAVE_PIPE2
760 }
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000761 }
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000762#endif
763 if (res != 0)
764 return PyErr_SetFromErrno(PyExc_OSError);
765 return Py_BuildValue("(ii)", fds[0], fds[1]);
766}
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000767
768/* module level code ********************************************************/
769
770PyDoc_STRVAR(module_doc,
771"A POSIX helper for the subprocess module.");
772
773
774static PyMethodDef module_methods[] = {
775 {"fork_exec", subprocess_fork_exec, METH_VARARGS, subprocess_fork_exec_doc},
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000776 {"cloexec_pipe", subprocess_cloexec_pipe, METH_NOARGS, subprocess_cloexec_pipe_doc},
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000777 {NULL, NULL} /* sentinel */
778};
779
780
781static struct PyModuleDef _posixsubprocessmodule = {
782 PyModuleDef_HEAD_INIT,
783 "_posixsubprocess",
784 module_doc,
785 -1, /* No memory is needed. */
786 module_methods,
787};
788
789PyMODINIT_FUNC
790PyInit__posixsubprocess(void)
791{
792#ifdef _SC_OPEN_MAX
793 max_fd = sysconf(_SC_OPEN_MAX);
794 if (max_fd == -1)
795#endif
796 max_fd = 256; /* Matches Lib/subprocess.py */
797
798 return PyModule_Create(&_posixsubprocessmodule);
799}