blob: 4ccd38bb6d65923613579271c2d7200dff56435e [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. Smith5591b022012-10-10 03:34:47 -0700359 int i, saved_errno, unused, reached_preexec = 0;
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
Gregory P. Smith5591b022012-10-10 03:34:47 -0700443 reached_preexec = 1;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000444 if (preexec_fn != Py_None && preexec_fn_args_tuple) {
445 /* This is where the user has asked us to deadlock their program. */
446 result = PyObject_Call(preexec_fn, preexec_fn_args_tuple, NULL);
447 if (result == NULL) {
448 /* Stringifying the exception or traceback would involve
449 * memory allocation and thus potential for deadlock.
450 * We've already faced potential deadlock by calling back
451 * into Python in the first place, so it probably doesn't
452 * matter but we avoid it to minimize the possibility. */
453 err_msg = "Exception occurred in preexec_fn.";
454 errno = 0; /* We don't want to report an OSError. */
455 goto error;
456 }
457 /* Py_DECREF(result); - We're about to exec so why bother? */
458 }
459
460 /* This loop matches the Lib/os.py _execvpe()'s PATH search when */
461 /* given the executable_list generated by Lib/subprocess.py. */
462 saved_errno = 0;
463 for (i = 0; exec_array[i] != NULL; ++i) {
464 const char *executable = exec_array[i];
465 if (envp) {
466 execve(executable, argv, envp);
467 } else {
468 execv(executable, argv);
469 }
470 if (errno != ENOENT && errno != ENOTDIR && saved_errno == 0) {
471 saved_errno = errno;
472 }
473 }
474 /* Report the first exec error, not the last. */
475 if (saved_errno)
476 errno = saved_errno;
477
478error:
479 saved_errno = errno;
480 /* Report the posix error to our parent process. */
Gregory P. Smith12fdca52012-01-21 12:31:25 -0800481 /* We ignore all write() return values as the total size of our writes is
482 * less than PIPEBUF and we cannot do anything about an error anyways. */
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000483 if (saved_errno) {
484 char *cur;
Gregory P. Smith12fdca52012-01-21 12:31:25 -0800485 unused = write(errpipe_write, "OSError:", 8);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000486 cur = hex_errno + sizeof(hex_errno);
487 while (saved_errno != 0 && cur > hex_errno) {
488 *--cur = "0123456789ABCDEF"[saved_errno % 16];
489 saved_errno /= 16;
490 }
Gregory P. Smith12fdca52012-01-21 12:31:25 -0800491 unused = write(errpipe_write, cur, hex_errno + sizeof(hex_errno) - cur);
492 unused = write(errpipe_write, ":", 1);
Gregory P. Smith5591b022012-10-10 03:34:47 -0700493 if (!reached_preexec) {
494 /* Indicate to the parent that the error happened before exec(). */
495 unused = write(errpipe_write, "noexec", 6);
496 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000497 /* We can't call strerror(saved_errno). It is not async signal safe.
498 * The parent process will look the error message up. */
499 } else {
Gregory P. Smith8d07c262012-11-10 23:53:47 -0800500 unused = write(errpipe_write, "SubprocessError:0:", 18);
Gregory P. Smith12fdca52012-01-21 12:31:25 -0800501 unused = write(errpipe_write, err_msg, strlen(err_msg));
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000502 }
Gregory P. Smith12fdca52012-01-21 12:31:25 -0800503 if (unused) return; /* silly? yes! avoids gcc compiler warning. */
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000504}
505
506
507static PyObject *
508subprocess_fork_exec(PyObject* self, PyObject *args)
509{
510 PyObject *gc_module = NULL;
Antoine Pitrou721738f2012-08-15 23:20:39 +0200511 PyObject *executable_list, *py_fds_to_keep;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000512 PyObject *env_list, *preexec_fn;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000513 PyObject *process_args, *converted_args = NULL, *fast_args = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000514 PyObject *preexec_fn_args_tuple = NULL;
515 int p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite;
516 int errpipe_read, errpipe_write, close_fds, restore_signals;
517 int call_setsid;
Victor Stinner0e59cc32010-04-16 23:49:32 +0000518 PyObject *cwd_obj, *cwd_obj2;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000519 const char *cwd;
520 pid_t pid;
521 int need_to_reenable_gc = 0;
522 char *const *exec_array, *const *argv = NULL, *const *envp = NULL;
Gregory P. Smith8facece2012-01-21 14:01:08 -0800523 Py_ssize_t arg_num;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000524
525 if (!PyArg_ParseTuple(
Antoine Pitrou721738f2012-08-15 23:20:39 +0200526 args, "OOpOOOiiiiiiiiiiO:fork_exec",
527 &process_args, &executable_list, &close_fds, &py_fds_to_keep,
Victor Stinner0e59cc32010-04-16 23:49:32 +0000528 &cwd_obj, &env_list,
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000529 &p2cread, &p2cwrite, &c2pread, &c2pwrite,
530 &errread, &errwrite, &errpipe_read, &errpipe_write,
531 &restore_signals, &call_setsid, &preexec_fn))
532 return NULL;
533
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000534 if (close_fds && errpipe_write < 3) { /* precondition */
535 PyErr_SetString(PyExc_ValueError, "errpipe_write must be >= 3");
536 return NULL;
537 }
Gregory P. Smith8facece2012-01-21 14:01:08 -0800538 if (PySequence_Length(py_fds_to_keep) < 0) {
539 PyErr_SetString(PyExc_ValueError, "cannot get length of fds_to_keep");
540 return NULL;
541 }
542 if (_sanity_check_python_fd_sequence(py_fds_to_keep)) {
543 PyErr_SetString(PyExc_ValueError, "bad value(s) in fds_to_keep");
Gregory P. Smithd4cc7bf2010-12-04 11:22:11 +0000544 return NULL;
545 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000546
547 /* We need to call gc.disable() when we'll be calling preexec_fn */
548 if (preexec_fn != Py_None) {
549 PyObject *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200550 _Py_IDENTIFIER(isenabled);
551 _Py_IDENTIFIER(disable);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200552
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000553 gc_module = PyImport_ImportModule("gc");
554 if (gc_module == NULL)
555 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200556 result = _PyObject_CallMethodId(gc_module, &PyId_isenabled, 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 need_to_reenable_gc = PyObject_IsTrue(result);
562 Py_DECREF(result);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000563 if (need_to_reenable_gc == -1) {
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 }
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200567 result = _PyObject_CallMethodId(gc_module, &PyId_disable, NULL);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000568 if (result == NULL) {
569 Py_DECREF(gc_module);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000570 return NULL;
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000571 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000572 Py_DECREF(result);
573 }
574
575 exec_array = _PySequence_BytesToCharpArray(executable_list);
Ross Lagerwallf2b34b82012-08-24 13:25:59 +0200576 if (!exec_array) {
577 Py_XDECREF(gc_module);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000578 return NULL;
Ross Lagerwallf2b34b82012-08-24 13:25:59 +0200579 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000580
581 /* Convert args and env into appropriate arguments for exec() */
582 /* These conversions are done in the parent process to avoid allocating
583 or freeing memory in the child process. */
584 if (process_args != Py_None) {
Gregory P. Smith68f52172010-03-15 06:07:42 +0000585 Py_ssize_t num_args;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000586 /* Equivalent to: */
587 /* tuple(PyUnicode_FSConverter(arg) for arg in process_args) */
Gregory P. Smith68f52172010-03-15 06:07:42 +0000588 fast_args = PySequence_Fast(process_args, "argv must be a tuple");
Stefan Krahdb579d72012-08-20 14:36:47 +0200589 if (fast_args == NULL)
590 goto cleanup;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000591 num_args = PySequence_Fast_GET_SIZE(fast_args);
592 converted_args = PyTuple_New(num_args);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000593 if (converted_args == NULL)
594 goto cleanup;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000595 for (arg_num = 0; arg_num < num_args; ++arg_num) {
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000596 PyObject *borrowed_arg, *converted_arg;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000597 borrowed_arg = PySequence_Fast_GET_ITEM(fast_args, arg_num);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000598 if (PyUnicode_FSConverter(borrowed_arg, &converted_arg) == 0)
599 goto cleanup;
600 PyTuple_SET_ITEM(converted_args, arg_num, converted_arg);
601 }
602
603 argv = _PySequence_BytesToCharpArray(converted_args);
604 Py_CLEAR(converted_args);
Gregory P. Smith68f52172010-03-15 06:07:42 +0000605 Py_CLEAR(fast_args);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000606 if (!argv)
607 goto cleanup;
608 }
609
610 if (env_list != Py_None) {
611 envp = _PySequence_BytesToCharpArray(env_list);
612 if (!envp)
613 goto cleanup;
614 }
615
616 if (preexec_fn != Py_None) {
617 preexec_fn_args_tuple = PyTuple_New(0);
618 if (!preexec_fn_args_tuple)
619 goto cleanup;
Victor Stinner0e59cc32010-04-16 23:49:32 +0000620 _PyImport_AcquireLock();
621 }
622
623 if (cwd_obj != Py_None) {
624 if (PyUnicode_FSConverter(cwd_obj, &cwd_obj2) == 0)
625 goto cleanup;
Victor Stinnerdcb24032010-04-22 12:08:36 +0000626 cwd = PyBytes_AsString(cwd_obj2);
Victor Stinner0e59cc32010-04-16 23:49:32 +0000627 } else {
628 cwd = NULL;
629 cwd_obj2 = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000630 }
631
632 pid = fork();
633 if (pid == 0) {
634 /* Child process */
Victor Stinner0e59cc32010-04-16 23:49:32 +0000635 /*
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000636 * Code from here to _exit() must only use async-signal-safe functions,
637 * listed at `man 7 signal` or
638 * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
639 */
640
641 if (preexec_fn != Py_None) {
642 /* We'll be calling back into Python later so we need to do this.
643 * This call may not be async-signal-safe but neither is calling
644 * back into Python. The user asked us to use hope as a strategy
645 * to avoid deadlock... */
646 PyOS_AfterFork();
647 }
648
649 child_exec(exec_array, argv, envp, cwd,
650 p2cread, p2cwrite, c2pread, c2pwrite,
651 errread, errwrite, errpipe_read, errpipe_write,
652 close_fds, restore_signals, call_setsid,
Gregory P. Smith8facece2012-01-21 14:01:08 -0800653 py_fds_to_keep, preexec_fn, preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000654 _exit(255);
655 return NULL; /* Dead code to avoid a potential compiler warning. */
656 }
Victor Stinner0e59cc32010-04-16 23:49:32 +0000657 Py_XDECREF(cwd_obj2);
658
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000659 if (pid == -1) {
660 /* Capture the errno exception before errno can be clobbered. */
661 PyErr_SetFromErrno(PyExc_OSError);
662 }
663 if (preexec_fn != Py_None &&
664 _PyImport_ReleaseLock() < 0 && !PyErr_Occurred()) {
665 PyErr_SetString(PyExc_RuntimeError,
666 "not holding the import lock");
667 }
668
669 /* Parent process */
670 if (envp)
671 _Py_FreeCharPArray(envp);
672 if (argv)
673 _Py_FreeCharPArray(argv);
674 _Py_FreeCharPArray(exec_array);
675
676 /* Reenable gc in the parent process (or if fork failed). */
677 if (need_to_reenable_gc && _enable_gc(gc_module)) {
678 Py_XDECREF(gc_module);
679 return NULL;
680 }
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000681 Py_XDECREF(preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000682 Py_XDECREF(gc_module);
683
684 if (pid == -1)
685 return NULL; /* fork() failed. Exception set earlier. */
686
687 return PyLong_FromPid(pid);
688
689cleanup:
690 if (envp)
691 _Py_FreeCharPArray(envp);
692 if (argv)
693 _Py_FreeCharPArray(argv);
694 _Py_FreeCharPArray(exec_array);
695 Py_XDECREF(converted_args);
Gregory P. Smith68f52172010-03-15 06:07:42 +0000696 Py_XDECREF(fast_args);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000697 Py_XDECREF(preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000698
699 /* Reenable gc if it was disabled. */
700 if (need_to_reenable_gc)
701 _enable_gc(gc_module);
702 Py_XDECREF(gc_module);
703 return NULL;
704}
705
706
707PyDoc_STRVAR(subprocess_fork_exec_doc,
708"fork_exec(args, executable_list, close_fds, cwd, env,\n\
709 p2cread, p2cwrite, c2pread, c2pwrite,\n\
710 errread, errwrite, errpipe_read, errpipe_write,\n\
711 restore_signals, call_setsid, preexec_fn)\n\
712\n\
713Forks a child process, closes parent file descriptors as appropriate in the\n\
714child and dups the few that are needed before calling exec() in the child\n\
715process.\n\
716\n\
717The preexec_fn, if supplied, will be called immediately before exec.\n\
718WARNING: preexec_fn is NOT SAFE if your application uses threads.\n\
719 It may trigger infrequent, difficult to debug deadlocks.\n\
720\n\
721If an error occurs in the child process before the exec, it is\n\
722serialized and written to the errpipe_write fd per subprocess.py.\n\
723\n\
724Returns: the child process's PID.\n\
725\n\
726Raises: Only on an error in the parent process.\n\
727");
728
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000729PyDoc_STRVAR(subprocess_cloexec_pipe_doc,
730"cloexec_pipe() -> (read_end, write_end)\n\n\
731Create a pipe whose ends have the cloexec flag set.");
732
733static PyObject *
734subprocess_cloexec_pipe(PyObject *self, PyObject *noargs)
735{
736 int fds[2];
737 int res;
738#ifdef HAVE_PIPE2
739 Py_BEGIN_ALLOW_THREADS
740 res = pipe2(fds, O_CLOEXEC);
741 Py_END_ALLOW_THREADS
Gregory P. Smithabcfcba2011-01-02 20:52:48 +0000742 if (res != 0 && errno == ENOSYS)
743 {
Gregory P. Smithabcfcba2011-01-02 20:52:48 +0000744 {
745#endif
746 /* We hold the GIL which offers some protection from other code calling
747 * fork() before the CLOEXEC flags have been set but we can't guarantee
748 * anything without pipe2(). */
749 long oldflags;
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000750
Gregory P. Smithabcfcba2011-01-02 20:52:48 +0000751 res = pipe(fds);
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000752
Gregory P. Smithabcfcba2011-01-02 20:52:48 +0000753 if (res == 0) {
754 oldflags = fcntl(fds[0], F_GETFD, 0);
755 if (oldflags < 0) res = oldflags;
756 }
757 if (res == 0)
758 res = fcntl(fds[0], F_SETFD, oldflags | FD_CLOEXEC);
759
760 if (res == 0) {
761 oldflags = fcntl(fds[1], F_GETFD, 0);
762 if (oldflags < 0) res = oldflags;
763 }
764 if (res == 0)
765 res = fcntl(fds[1], F_SETFD, oldflags | FD_CLOEXEC);
766#ifdef HAVE_PIPE2
767 }
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000768 }
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000769#endif
770 if (res != 0)
771 return PyErr_SetFromErrno(PyExc_OSError);
772 return Py_BuildValue("(ii)", fds[0], fds[1]);
773}
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000774
775/* module level code ********************************************************/
776
777PyDoc_STRVAR(module_doc,
778"A POSIX helper for the subprocess module.");
779
780
781static PyMethodDef module_methods[] = {
782 {"fork_exec", subprocess_fork_exec, METH_VARARGS, subprocess_fork_exec_doc},
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000783 {"cloexec_pipe", subprocess_cloexec_pipe, METH_NOARGS, subprocess_cloexec_pipe_doc},
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000784 {NULL, NULL} /* sentinel */
785};
786
787
788static struct PyModuleDef _posixsubprocessmodule = {
789 PyModuleDef_HEAD_INIT,
790 "_posixsubprocess",
791 module_doc,
792 -1, /* No memory is needed. */
793 module_methods,
794};
795
796PyMODINIT_FUNC
797PyInit__posixsubprocess(void)
798{
799#ifdef _SC_OPEN_MAX
800 max_fd = sysconf(_SC_OPEN_MAX);
801 if (max_fd == -1)
802#endif
803 max_fd = 256; /* Matches Lib/subprocess.py */
804
805 return PyModule_Create(&_posixsubprocessmodule);
806}