blob: 4a147880d582cc180c6019275052957f468ab544 [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;
Gregory P. Smithd4cc7bf2010-12-04 11:22:11 +0000506 PyObject *executable_list, *py_close_fds, *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(
Gregory P. Smithd4cc7bf2010-12-04 11:22:11 +0000521 args, "OOOOOOiiiiiiiiiiO:fork_exec",
522 &process_args, &executable_list, &py_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
529 close_fds = PyObject_IsTrue(py_close_fds);
530 if (close_fds && errpipe_write < 3) { /* precondition */
531 PyErr_SetString(PyExc_ValueError, "errpipe_write must be >= 3");
532 return NULL;
533 }
Gregory P. Smith8facece2012-01-21 14:01:08 -0800534 if (PySequence_Length(py_fds_to_keep) < 0) {
535 PyErr_SetString(PyExc_ValueError, "cannot get length of fds_to_keep");
536 return NULL;
537 }
538 if (_sanity_check_python_fd_sequence(py_fds_to_keep)) {
539 PyErr_SetString(PyExc_ValueError, "bad value(s) in fds_to_keep");
Gregory P. Smithd4cc7bf2010-12-04 11:22:11 +0000540 return NULL;
541 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000542
543 /* We need to call gc.disable() when we'll be calling preexec_fn */
544 if (preexec_fn != Py_None) {
545 PyObject *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200546 _Py_IDENTIFIER(isenabled);
547 _Py_IDENTIFIER(disable);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200548
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000549 gc_module = PyImport_ImportModule("gc");
550 if (gc_module == NULL)
551 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200552 result = _PyObject_CallMethodId(gc_module, &PyId_isenabled, NULL);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000553 if (result == NULL) {
554 Py_DECREF(gc_module);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000555 return NULL;
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000556 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000557 need_to_reenable_gc = PyObject_IsTrue(result);
558 Py_DECREF(result);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000559 if (need_to_reenable_gc == -1) {
560 Py_DECREF(gc_module);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000561 return NULL;
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000562 }
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200563 result = _PyObject_CallMethodId(gc_module, &PyId_disable, NULL);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000564 if (result == NULL) {
565 Py_DECREF(gc_module);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000566 return NULL;
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000567 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000568 Py_DECREF(result);
569 }
570
571 exec_array = _PySequence_BytesToCharpArray(executable_list);
572 if (!exec_array)
573 return NULL;
574
575 /* Convert args and env into appropriate arguments for exec() */
576 /* These conversions are done in the parent process to avoid allocating
577 or freeing memory in the child process. */
578 if (process_args != Py_None) {
Gregory P. Smith68f52172010-03-15 06:07:42 +0000579 Py_ssize_t num_args;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000580 /* Equivalent to: */
581 /* tuple(PyUnicode_FSConverter(arg) for arg in process_args) */
Gregory P. Smith68f52172010-03-15 06:07:42 +0000582 fast_args = PySequence_Fast(process_args, "argv must be a tuple");
583 num_args = PySequence_Fast_GET_SIZE(fast_args);
584 converted_args = PyTuple_New(num_args);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000585 if (converted_args == NULL)
586 goto cleanup;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000587 for (arg_num = 0; arg_num < num_args; ++arg_num) {
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000588 PyObject *borrowed_arg, *converted_arg;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000589 borrowed_arg = PySequence_Fast_GET_ITEM(fast_args, arg_num);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000590 if (PyUnicode_FSConverter(borrowed_arg, &converted_arg) == 0)
591 goto cleanup;
592 PyTuple_SET_ITEM(converted_args, arg_num, converted_arg);
593 }
594
595 argv = _PySequence_BytesToCharpArray(converted_args);
596 Py_CLEAR(converted_args);
Gregory P. Smith68f52172010-03-15 06:07:42 +0000597 Py_CLEAR(fast_args);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000598 if (!argv)
599 goto cleanup;
600 }
601
602 if (env_list != Py_None) {
603 envp = _PySequence_BytesToCharpArray(env_list);
604 if (!envp)
605 goto cleanup;
606 }
607
608 if (preexec_fn != Py_None) {
609 preexec_fn_args_tuple = PyTuple_New(0);
610 if (!preexec_fn_args_tuple)
611 goto cleanup;
Victor Stinner0e59cc32010-04-16 23:49:32 +0000612 _PyImport_AcquireLock();
613 }
614
615 if (cwd_obj != Py_None) {
616 if (PyUnicode_FSConverter(cwd_obj, &cwd_obj2) == 0)
617 goto cleanup;
Victor Stinnerdcb24032010-04-22 12:08:36 +0000618 cwd = PyBytes_AsString(cwd_obj2);
Victor Stinner0e59cc32010-04-16 23:49:32 +0000619 } else {
620 cwd = NULL;
621 cwd_obj2 = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000622 }
623
624 pid = fork();
625 if (pid == 0) {
626 /* Child process */
Victor Stinner0e59cc32010-04-16 23:49:32 +0000627 /*
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000628 * Code from here to _exit() must only use async-signal-safe functions,
629 * listed at `man 7 signal` or
630 * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
631 */
632
633 if (preexec_fn != Py_None) {
634 /* We'll be calling back into Python later so we need to do this.
635 * This call may not be async-signal-safe but neither is calling
636 * back into Python. The user asked us to use hope as a strategy
637 * to avoid deadlock... */
638 PyOS_AfterFork();
639 }
640
641 child_exec(exec_array, argv, envp, cwd,
642 p2cread, p2cwrite, c2pread, c2pwrite,
643 errread, errwrite, errpipe_read, errpipe_write,
644 close_fds, restore_signals, call_setsid,
Gregory P. Smith8facece2012-01-21 14:01:08 -0800645 py_fds_to_keep, preexec_fn, preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000646 _exit(255);
647 return NULL; /* Dead code to avoid a potential compiler warning. */
648 }
Victor Stinner0e59cc32010-04-16 23:49:32 +0000649 Py_XDECREF(cwd_obj2);
650
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000651 if (pid == -1) {
652 /* Capture the errno exception before errno can be clobbered. */
653 PyErr_SetFromErrno(PyExc_OSError);
654 }
655 if (preexec_fn != Py_None &&
656 _PyImport_ReleaseLock() < 0 && !PyErr_Occurred()) {
657 PyErr_SetString(PyExc_RuntimeError,
658 "not holding the import lock");
659 }
660
661 /* Parent process */
662 if (envp)
663 _Py_FreeCharPArray(envp);
664 if (argv)
665 _Py_FreeCharPArray(argv);
666 _Py_FreeCharPArray(exec_array);
667
668 /* Reenable gc in the parent process (or if fork failed). */
669 if (need_to_reenable_gc && _enable_gc(gc_module)) {
670 Py_XDECREF(gc_module);
671 return NULL;
672 }
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000673 Py_XDECREF(preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000674 Py_XDECREF(gc_module);
675
676 if (pid == -1)
677 return NULL; /* fork() failed. Exception set earlier. */
678
679 return PyLong_FromPid(pid);
680
681cleanup:
682 if (envp)
683 _Py_FreeCharPArray(envp);
684 if (argv)
685 _Py_FreeCharPArray(argv);
686 _Py_FreeCharPArray(exec_array);
687 Py_XDECREF(converted_args);
Gregory P. Smith68f52172010-03-15 06:07:42 +0000688 Py_XDECREF(fast_args);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000689 Py_XDECREF(preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000690
691 /* Reenable gc if it was disabled. */
692 if (need_to_reenable_gc)
693 _enable_gc(gc_module);
694 Py_XDECREF(gc_module);
695 return NULL;
696}
697
698
699PyDoc_STRVAR(subprocess_fork_exec_doc,
700"fork_exec(args, executable_list, close_fds, cwd, env,\n\
701 p2cread, p2cwrite, c2pread, c2pwrite,\n\
702 errread, errwrite, errpipe_read, errpipe_write,\n\
703 restore_signals, call_setsid, preexec_fn)\n\
704\n\
705Forks a child process, closes parent file descriptors as appropriate in the\n\
706child and dups the few that are needed before calling exec() in the child\n\
707process.\n\
708\n\
709The preexec_fn, if supplied, will be called immediately before exec.\n\
710WARNING: preexec_fn is NOT SAFE if your application uses threads.\n\
711 It may trigger infrequent, difficult to debug deadlocks.\n\
712\n\
713If an error occurs in the child process before the exec, it is\n\
714serialized and written to the errpipe_write fd per subprocess.py.\n\
715\n\
716Returns: the child process's PID.\n\
717\n\
718Raises: Only on an error in the parent process.\n\
719");
720
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000721PyDoc_STRVAR(subprocess_cloexec_pipe_doc,
722"cloexec_pipe() -> (read_end, write_end)\n\n\
723Create a pipe whose ends have the cloexec flag set.");
724
725static PyObject *
726subprocess_cloexec_pipe(PyObject *self, PyObject *noargs)
727{
728 int fds[2];
729 int res;
730#ifdef HAVE_PIPE2
731 Py_BEGIN_ALLOW_THREADS
732 res = pipe2(fds, O_CLOEXEC);
733 Py_END_ALLOW_THREADS
Gregory P. Smithabcfcba2011-01-02 20:52:48 +0000734 if (res != 0 && errno == ENOSYS)
735 {
Gregory P. Smithabcfcba2011-01-02 20:52:48 +0000736 {
737#endif
738 /* We hold the GIL which offers some protection from other code calling
739 * fork() before the CLOEXEC flags have been set but we can't guarantee
740 * anything without pipe2(). */
741 long oldflags;
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000742
Gregory P. Smithabcfcba2011-01-02 20:52:48 +0000743 res = pipe(fds);
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000744
Gregory P. Smithabcfcba2011-01-02 20:52:48 +0000745 if (res == 0) {
746 oldflags = fcntl(fds[0], F_GETFD, 0);
747 if (oldflags < 0) res = oldflags;
748 }
749 if (res == 0)
750 res = fcntl(fds[0], F_SETFD, oldflags | FD_CLOEXEC);
751
752 if (res == 0) {
753 oldflags = fcntl(fds[1], F_GETFD, 0);
754 if (oldflags < 0) res = oldflags;
755 }
756 if (res == 0)
757 res = fcntl(fds[1], F_SETFD, oldflags | FD_CLOEXEC);
758#ifdef HAVE_PIPE2
759 }
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000760 }
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000761#endif
762 if (res != 0)
763 return PyErr_SetFromErrno(PyExc_OSError);
764 return Py_BuildValue("(ii)", fds[0], fds[1]);
765}
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000766
767/* module level code ********************************************************/
768
769PyDoc_STRVAR(module_doc,
770"A POSIX helper for the subprocess module.");
771
772
773static PyMethodDef module_methods[] = {
774 {"fork_exec", subprocess_fork_exec, METH_VARARGS, subprocess_fork_exec_doc},
Gregory P. Smith51ee2702010-12-13 07:59:39 +0000775 {"cloexec_pipe", subprocess_cloexec_pipe, METH_NOARGS, subprocess_cloexec_pipe_doc},
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000776 {NULL, NULL} /* sentinel */
777};
778
779
780static struct PyModuleDef _posixsubprocessmodule = {
781 PyModuleDef_HEAD_INIT,
782 "_posixsubprocess",
783 module_doc,
784 -1, /* No memory is needed. */
785 module_methods,
786};
787
788PyMODINIT_FUNC
789PyInit__posixsubprocess(void)
790{
791#ifdef _SC_OPEN_MAX
792 max_fd = sysconf(_SC_OPEN_MAX);
793 if (max_fd == -1)
794#endif
795 max_fd = 256; /* Matches Lib/subprocess.py */
796
797 return PyModule_Create(&_posixsubprocessmodule);
798}