blob: 39914c5ec5427b53975978f165ad13f28bd87853 [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. Smithefeb9da2014-04-14 13:31:21 -070021#if defined(__ANDROID__) && !defined(SYS_getdents64)
22/* Android doesn't expose syscalls, add the definition manually. */
23# include <sys/linux-syscalls.h>
24# define SYS_getdents64 __NR_getdents64
25#endif
26
Gregory P. Smithe3f78482012-01-21 15:16:17 -080027#if defined(sun)
28/* readdir64 is used to work around Solaris 9 bug 6395699. */
29# define readdir readdir64
30# define dirent dirent64
31# if !defined(HAVE_DIRFD)
Gregory P. Smith8facece2012-01-21 14:01:08 -080032/* Some versions of Solaris lack dirfd(). */
Gregory P. Smithe9b7cab2012-01-21 15:19:11 -080033# define dirfd(dirp) ((dirp)->dd_fd)
Gregory P. Smithe3f78482012-01-21 15:16:17 -080034# define HAVE_DIRFD
Gregory P. Smithe3f78482012-01-21 15:16:17 -080035# endif
Gregory P. Smith8facece2012-01-21 14:01:08 -080036#endif
37
Gregory P. Smith4842efc2012-01-21 21:01:24 -080038#if defined(__FreeBSD__) || (defined(__APPLE__) && defined(__MACH__))
39# define FD_DIR "/dev/fd"
40#else
41# define FD_DIR "/proc/self/fd"
42#endif
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +000043
Victor Stinnerdaf45552013-08-28 00:53:59 +020044#define POSIX_CALL(call) do { if ((call) == -1) goto error; } while (0)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +000045
46
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +000047/* Given the gc module call gc.enable() and return 0 on success. */
Benjamin Peterson91eef982012-01-22 20:04:46 -050048static int
49_enable_gc(PyObject *gc_module)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +000050{
51 PyObject *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +020052 _Py_IDENTIFIER(enable);
Martin v. Löwisafe55bb2011-10-09 10:38:36 +020053
54 result = _PyObject_CallMethodId(gc_module, &PyId_enable, NULL);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +000055 if (result == NULL)
56 return 1;
57 Py_DECREF(result);
58 return 0;
59}
60
61
Gregory P. Smith8facece2012-01-21 14:01:08 -080062/* Convert ASCII to a positive int, no libc call. no overflow. -1 on error. */
Benjamin Peterson91eef982012-01-22 20:04:46 -050063static int
64_pos_int_from_ascii(char *name)
Gregory P. Smith8facece2012-01-21 14:01:08 -080065{
66 int num = 0;
67 while (*name >= '0' && *name <= '9') {
68 num = num * 10 + (*name - '0');
69 ++name;
70 }
71 if (*name)
72 return -1; /* Non digit found, not a number. */
73 return num;
74}
75
76
Gregory P. Smith4842efc2012-01-21 21:01:24 -080077#if defined(__FreeBSD__)
78/* When /dev/fd isn't mounted it is often a static directory populated
79 * with 0 1 2 or entries for 0 .. 63 on FreeBSD, NetBSD and OpenBSD.
80 * NetBSD and OpenBSD have a /proc fs available (though not necessarily
81 * mounted) and do not have fdescfs for /dev/fd. MacOS X has a devfs
82 * that properly supports /dev/fd.
83 */
Benjamin Peterson91eef982012-01-22 20:04:46 -050084static int
Ross Lagerwall7f4fdb22012-03-07 20:06:33 +020085_is_fdescfs_mounted_on_dev_fd(void)
Gregory P. Smith4842efc2012-01-21 21:01:24 -080086{
87 struct stat dev_stat;
88 struct stat dev_fd_stat;
89 if (stat("/dev", &dev_stat) != 0)
90 return 0;
91 if (stat(FD_DIR, &dev_fd_stat) != 0)
Victor Stinnerdaf45552013-08-28 00:53:59 +020092 return 0;
Gregory P. Smith4842efc2012-01-21 21:01:24 -080093 if (dev_stat.st_dev == dev_fd_stat.st_dev)
94 return 0; /* / == /dev == /dev/fd means it is static. #fail */
95 return 1;
96}
97#endif
98
99
Gregory P. Smith8facece2012-01-21 14:01:08 -0800100/* Returns 1 if there is a problem with fd_sequence, 0 otherwise. */
Benjamin Peterson91eef982012-01-22 20:04:46 -0500101static int
102_sanity_check_python_fd_sequence(PyObject *fd_sequence)
Gregory P. Smith8facece2012-01-21 14:01:08 -0800103{
104 Py_ssize_t seq_idx, seq_len = PySequence_Length(fd_sequence);
105 long prev_fd = -1;
106 for (seq_idx = 0; seq_idx < seq_len; ++seq_idx) {
107 PyObject* py_fd = PySequence_Fast_GET_ITEM(fd_sequence, seq_idx);
108 long iter_fd = PyLong_AsLong(py_fd);
109 if (iter_fd < 0 || iter_fd < prev_fd || iter_fd > INT_MAX) {
110 /* Negative, overflow, not a Long, unsorted, too big for a fd. */
111 return 1;
112 }
113 }
114 return 0;
115}
116
117
118/* Is fd found in the sorted Python Sequence? */
Benjamin Peterson91eef982012-01-22 20:04:46 -0500119static int
120_is_fd_in_sorted_fd_sequence(int fd, PyObject *fd_sequence)
Gregory P. Smith8facece2012-01-21 14:01:08 -0800121{
122 /* Binary search. */
123 Py_ssize_t search_min = 0;
124 Py_ssize_t search_max = PySequence_Length(fd_sequence) - 1;
125 if (search_max < 0)
126 return 0;
127 do {
128 long middle = (search_min + search_max) / 2;
129 long middle_fd = PyLong_AsLong(
130 PySequence_Fast_GET_ITEM(fd_sequence, middle));
131 if (fd == middle_fd)
132 return 1;
133 if (fd > middle_fd)
134 search_min = middle + 1;
135 else
136 search_max = middle - 1;
137 } while (search_min <= search_max);
138 return 0;
139}
140
Victor Stinnerdaf45552013-08-28 00:53:59 +0200141static int
142make_inheritable(PyObject *py_fds_to_keep, int errpipe_write)
143{
144 Py_ssize_t i, len;
145
146 len = PySequence_Length(py_fds_to_keep);
147 for (i = 0; i < len; ++i) {
148 PyObject* fdobj = PySequence_Fast_GET_ITEM(py_fds_to_keep, i);
149 long fd = PyLong_AsLong(fdobj);
150 assert(!PyErr_Occurred());
151 assert(0 <= fd && fd <= INT_MAX);
152 if (fd == errpipe_write) {
153 /* errpipe_write is part of py_fds_to_keep. It must be closed at
154 exec(), but kept open in the child process until exec() is
155 called. */
156 continue;
157 }
158 if (_Py_set_inheritable((int)fd, 1, NULL) < 0)
159 return -1;
160 }
161 return 0;
162}
163
Gregory P. Smith8facece2012-01-21 14:01:08 -0800164
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700165/* Get the maximum file descriptor that could be opened by this process.
166 * This function is async signal safe for use between fork() and exec().
167 */
168static long
169safe_get_max_fd(void)
170{
171 long local_max_fd;
172#if defined(__NetBSD__)
173 local_max_fd = fcntl(0, F_MAXFD);
174 if (local_max_fd >= 0)
175 return local_max_fd;
176#endif
177#ifdef _SC_OPEN_MAX
178 local_max_fd = sysconf(_SC_OPEN_MAX);
179 if (local_max_fd == -1)
180#endif
181 local_max_fd = 256; /* Matches legacy Lib/subprocess.py behavior. */
182 return local_max_fd;
183}
184
185
186/* Close all file descriptors in the range from start_fd and higher
187 * except for those in py_fds_to_keep. If the range defined by
188 * [start_fd, safe_get_max_fd()) is large this will take a long
189 * time as it calls close() on EVERY possible fd.
190 *
191 * It isn't possible to know for sure what the max fd to go up to
192 * is for processes with the capability of raising their maximum.
Gregory P. Smith8facece2012-01-21 14:01:08 -0800193 */
Benjamin Peterson91eef982012-01-22 20:04:46 -0500194static void
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700195_close_fds_by_brute_force(long start_fd, PyObject *py_fds_to_keep)
Gregory P. Smith8facece2012-01-21 14:01:08 -0800196{
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700197 long end_fd = safe_get_max_fd();
Gregory P. Smith8facece2012-01-21 14:01:08 -0800198 Py_ssize_t num_fds_to_keep = PySequence_Length(py_fds_to_keep);
199 Py_ssize_t keep_seq_idx;
200 int fd_num;
201 /* As py_fds_to_keep is sorted we can loop through the list closing
202 * fds inbetween any in the keep list falling within our range. */
203 for (keep_seq_idx = 0; keep_seq_idx < num_fds_to_keep; ++keep_seq_idx) {
204 PyObject* py_keep_fd = PySequence_Fast_GET_ITEM(py_fds_to_keep,
205 keep_seq_idx);
206 int keep_fd = PyLong_AsLong(py_keep_fd);
207 if (keep_fd < start_fd)
208 continue;
209 for (fd_num = start_fd; fd_num < keep_fd; ++fd_num) {
Victor Stinnere7c74922015-04-02 16:24:46 +0200210 close(fd_num);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800211 }
212 start_fd = keep_fd + 1;
213 }
214 if (start_fd <= end_fd) {
215 for (fd_num = start_fd; fd_num < end_fd; ++fd_num) {
Victor Stinnere7c74922015-04-02 16:24:46 +0200216 close(fd_num);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800217 }
218 }
219}
220
221
222#if defined(__linux__) && defined(HAVE_SYS_SYSCALL_H)
223/* It doesn't matter if d_name has room for NAME_MAX chars; we're using this
224 * only to read a directory of short file descriptor number names. The kernel
225 * will return an error if we didn't give it enough space. Highly Unlikely.
226 * This structure is very old and stable: It will not change unless the kernel
227 * chooses to break compatibility with all existing binaries. Highly Unlikely.
228 */
Gregory P. Smith255bf5b2013-03-03 10:45:05 -0800229struct linux_dirent64 {
Gregory P. Smith58f07a92012-06-05 13:26:39 -0700230 unsigned long long d_ino;
Gregory P. Smith255bf5b2013-03-03 10:45:05 -0800231 long long d_off;
Gregory P. Smith8facece2012-01-21 14:01:08 -0800232 unsigned short d_reclen; /* Length of this linux_dirent */
Gregory P. Smith255bf5b2013-03-03 10:45:05 -0800233 unsigned char d_type;
Gregory P. Smith8facece2012-01-21 14:01:08 -0800234 char d_name[256]; /* Filename (null-terminated) */
235};
236
Gregory P. Smitha26987a2014-06-01 13:46:36 -0700237/* Close all open file descriptors in the range from start_fd and higher
238 * Do not close any in the sorted py_fds_to_keep list.
Gregory P. Smith8facece2012-01-21 14:01:08 -0800239 *
240 * This version is async signal safe as it does not make any unsafe C library
241 * calls, malloc calls or handle any locks. It is _unfortunate_ to be forced
242 * to resort to making a kernel system call directly but this is the ONLY api
243 * available that does no harm. opendir/readdir/closedir perform memory
244 * allocation and locking so while they usually work they are not guaranteed
245 * to (especially if you have replaced your malloc implementation). A version
246 * of this function that uses those can be found in the _maybe_unsafe variant.
247 *
248 * This is Linux specific because that is all I am ready to test it on. It
249 * should be easy to add OS specific dirent or dirent64 structures and modify
250 * it with some cpp #define magic to work on other OSes as well if you want.
251 */
Benjamin Peterson91eef982012-01-22 20:04:46 -0500252static void
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700253_close_open_fds_safe(int start_fd, PyObject* py_fds_to_keep)
Gregory P. Smith8facece2012-01-21 14:01:08 -0800254{
255 int fd_dir_fd;
Victor Stinnerdaf45552013-08-28 00:53:59 +0200256
Victor Stinner160e8192015-03-30 02:18:31 +0200257 fd_dir_fd = _Py_open_noraise(FD_DIR, O_RDONLY);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800258 if (fd_dir_fd == -1) {
259 /* No way to get a list of open fds. */
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700260 _close_fds_by_brute_force(start_fd, py_fds_to_keep);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800261 return;
262 } else {
Gregory P. Smith255bf5b2013-03-03 10:45:05 -0800263 char buffer[sizeof(struct linux_dirent64)];
Gregory P. Smith8facece2012-01-21 14:01:08 -0800264 int bytes;
Gregory P. Smith255bf5b2013-03-03 10:45:05 -0800265 while ((bytes = syscall(SYS_getdents64, fd_dir_fd,
266 (struct linux_dirent64 *)buffer,
Gregory P. Smith8facece2012-01-21 14:01:08 -0800267 sizeof(buffer))) > 0) {
Gregory P. Smith255bf5b2013-03-03 10:45:05 -0800268 struct linux_dirent64 *entry;
Gregory P. Smith8facece2012-01-21 14:01:08 -0800269 int offset;
270 for (offset = 0; offset < bytes; offset += entry->d_reclen) {
271 int fd;
Gregory P. Smith255bf5b2013-03-03 10:45:05 -0800272 entry = (struct linux_dirent64 *)(buffer + offset);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800273 if ((fd = _pos_int_from_ascii(entry->d_name)) < 0)
274 continue; /* Not a number. */
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700275 if (fd != fd_dir_fd && fd >= start_fd &&
Gregory P. Smith8facece2012-01-21 14:01:08 -0800276 !_is_fd_in_sorted_fd_sequence(fd, py_fds_to_keep)) {
Victor Stinnere7c74922015-04-02 16:24:46 +0200277 close(fd);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800278 }
279 }
280 }
Victor Stinnere7c74922015-04-02 16:24:46 +0200281 close(fd_dir_fd);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800282 }
283}
284
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700285#define _close_open_fds _close_open_fds_safe
Gregory P. Smith8facece2012-01-21 14:01:08 -0800286
287#else /* NOT (defined(__linux__) && defined(HAVE_SYS_SYSCALL_H)) */
288
289
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700290/* Close all open file descriptors from start_fd and higher.
291 * Do not close any in the sorted py_fds_to_keep list.
Gregory P. Smith8facece2012-01-21 14:01:08 -0800292 *
293 * This function violates the strict use of async signal safe functions. :(
Gregory P. Smithe3f78482012-01-21 15:16:17 -0800294 * It calls opendir(), readdir() and closedir(). Of these, the one most
Gregory P. Smith8facece2012-01-21 14:01:08 -0800295 * likely to ever cause a problem is opendir() as it performs an internal
296 * malloc(). Practically this should not be a problem. The Java VM makes the
297 * same calls between fork and exec in its own UNIXProcess_md.c implementation.
298 *
299 * readdir_r() is not used because it provides no benefit. It is typically
300 * implemented as readdir() followed by memcpy(). See also:
301 * http://womble.decadent.org.uk/readdir_r-advisory.html
302 */
Benjamin Peterson91eef982012-01-22 20:04:46 -0500303static void
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700304_close_open_fds_maybe_unsafe(long start_fd, PyObject* py_fds_to_keep)
Gregory P. Smith8facece2012-01-21 14:01:08 -0800305{
306 DIR *proc_fd_dir;
307#ifndef HAVE_DIRFD
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700308 while (_is_fd_in_sorted_fd_sequence(start_fd, py_fds_to_keep)) {
Gregory P. Smith8facece2012-01-21 14:01:08 -0800309 ++start_fd;
310 }
Gregory P. Smith8facece2012-01-21 14:01:08 -0800311 /* Close our lowest fd before we call opendir so that it is likely to
312 * reuse that fd otherwise we might close opendir's file descriptor in
313 * our loop. This trick assumes that fd's are allocated on a lowest
314 * available basis. */
Victor Stinnere7c74922015-04-02 16:24:46 +0200315 close(start_fd);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800316 ++start_fd;
317#endif
Gregory P. Smith8facece2012-01-21 14:01:08 -0800318
Gregory P. Smith4842efc2012-01-21 21:01:24 -0800319#if defined(__FreeBSD__)
320 if (!_is_fdescfs_mounted_on_dev_fd())
321 proc_fd_dir = NULL;
322 else
323#endif
324 proc_fd_dir = opendir(FD_DIR);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800325 if (!proc_fd_dir) {
326 /* No way to get a list of open fds. */
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700327 _close_fds_by_brute_force(start_fd, py_fds_to_keep);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800328 } else {
Gregory P. Smithe3f78482012-01-21 15:16:17 -0800329 struct dirent *dir_entry;
Gregory P. Smith8facece2012-01-21 14:01:08 -0800330#ifdef HAVE_DIRFD
Gregory P. Smithe9b7cab2012-01-21 15:19:11 -0800331 int fd_used_by_opendir = dirfd(proc_fd_dir);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800332#else
333 int fd_used_by_opendir = start_fd - 1;
334#endif
335 errno = 0;
Gregory P. Smithe3f78482012-01-21 15:16:17 -0800336 while ((dir_entry = readdir(proc_fd_dir))) {
Gregory P. Smith8facece2012-01-21 14:01:08 -0800337 int fd;
338 if ((fd = _pos_int_from_ascii(dir_entry->d_name)) < 0)
339 continue; /* Not a number. */
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700340 if (fd != fd_used_by_opendir && fd >= start_fd &&
Gregory P. Smith8facece2012-01-21 14:01:08 -0800341 !_is_fd_in_sorted_fd_sequence(fd, py_fds_to_keep)) {
Victor Stinnere7c74922015-04-02 16:24:46 +0200342 close(fd);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800343 }
344 errno = 0;
345 }
346 if (errno) {
347 /* readdir error, revert behavior. Highly Unlikely. */
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700348 _close_fds_by_brute_force(start_fd, py_fds_to_keep);
Gregory P. Smith8facece2012-01-21 14:01:08 -0800349 }
350 closedir(proc_fd_dir);
351 }
352}
353
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700354#define _close_open_fds _close_open_fds_maybe_unsafe
Gregory P. Smith8facece2012-01-21 14:01:08 -0800355
356#endif /* else NOT (defined(__linux__) && defined(HAVE_SYS_SYSCALL_H)) */
357
358
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000359/*
360 * This function is code executed in the child process immediately after fork
361 * to set things up and call exec().
362 *
363 * All of the code in this function must only use async-signal-safe functions,
364 * listed at `man 7 signal` or
365 * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
366 *
367 * This restriction is documented at
368 * http://www.opengroup.org/onlinepubs/009695399/functions/fork.html.
369 */
Benjamin Peterson91eef982012-01-22 20:04:46 -0500370static void
371child_exec(char *const exec_array[],
372 char *const argv[],
373 char *const envp[],
374 const char *cwd,
375 int p2cread, int p2cwrite,
376 int c2pread, int c2pwrite,
377 int errread, int errwrite,
378 int errpipe_read, int errpipe_write,
379 int close_fds, int restore_signals,
380 int call_setsid,
381 PyObject *py_fds_to_keep,
382 PyObject *preexec_fn,
383 PyObject *preexec_fn_args_tuple)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000384{
Victor Stinner185fd332015-04-01 18:35:53 +0200385 int i, saved_errno, reached_preexec = 0;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000386 PyObject *result;
Gregory P. Smith14affb82010-12-22 05:22:17 +0000387 const char* err_msg = "";
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000388 /* Buffer large enough to hold a hex integer. We can't malloc. */
389 char hex_errno[sizeof(saved_errno)*2+1];
390
Victor Stinnerdaf45552013-08-28 00:53:59 +0200391 if (make_inheritable(py_fds_to_keep, errpipe_write) < 0)
392 goto error;
393
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000394 /* Close parent's pipe ends. */
Victor Stinnerdaf45552013-08-28 00:53:59 +0200395 if (p2cwrite != -1)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000396 POSIX_CALL(close(p2cwrite));
Victor Stinnerdaf45552013-08-28 00:53:59 +0200397 if (c2pread != -1)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000398 POSIX_CALL(close(c2pread));
Victor Stinnerdaf45552013-08-28 00:53:59 +0200399 if (errread != -1)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000400 POSIX_CALL(close(errread));
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000401 POSIX_CALL(close(errpipe_read));
402
Ross Lagerwalld98646e2011-07-27 07:16:31 +0200403 /* When duping fds, if there arises a situation where one of the fds is
404 either 0, 1 or 2, it is possible that it is overwritten (#12607). */
405 if (c2pwrite == 0)
406 POSIX_CALL(c2pwrite = dup(c2pwrite));
407 if (errwrite == 0 || errwrite == 1)
408 POSIX_CALL(errwrite = dup(errwrite));
409
Antoine Pitrouc9c83ba2011-01-03 18:23:55 +0000410 /* Dup fds for child.
411 dup2() removes the CLOEXEC flag but we must do it ourselves if dup2()
412 would be a no-op (issue #10806). */
413 if (p2cread == 0) {
Victor Stinnerdaf45552013-08-28 00:53:59 +0200414 if (_Py_set_inheritable(p2cread, 1, NULL) < 0)
415 goto error;
416 }
417 else if (p2cread != -1)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000418 POSIX_CALL(dup2(p2cread, 0)); /* stdin */
Victor Stinnerdaf45552013-08-28 00:53:59 +0200419
Antoine Pitrouc9c83ba2011-01-03 18:23:55 +0000420 if (c2pwrite == 1) {
Victor Stinnerdaf45552013-08-28 00:53:59 +0200421 if (_Py_set_inheritable(c2pwrite, 1, NULL) < 0)
422 goto error;
423 }
424 else if (c2pwrite != -1)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000425 POSIX_CALL(dup2(c2pwrite, 1)); /* stdout */
Victor Stinnerdaf45552013-08-28 00:53:59 +0200426
Antoine Pitrouc9c83ba2011-01-03 18:23:55 +0000427 if (errwrite == 2) {
Victor Stinnerdaf45552013-08-28 00:53:59 +0200428 if (_Py_set_inheritable(errwrite, 1, NULL) < 0)
429 goto error;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000430 }
Victor Stinnerdaf45552013-08-28 00:53:59 +0200431 else if (errwrite != -1)
432 POSIX_CALL(dup2(errwrite, 2)); /* stderr */
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000433
434 /* Close pipe fds. Make sure we don't close the same fd more than */
435 /* once, or standard fds. */
Victor Stinnerdaf45552013-08-28 00:53:59 +0200436 if (p2cread > 2)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000437 POSIX_CALL(close(p2cread));
Victor Stinnerdaf45552013-08-28 00:53:59 +0200438 if (c2pwrite > 2 && c2pwrite != p2cread)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000439 POSIX_CALL(close(c2pwrite));
Victor Stinnerdaf45552013-08-28 00:53:59 +0200440 if (errwrite != c2pwrite && errwrite != p2cread && errwrite > 2)
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000441 POSIX_CALL(close(errwrite));
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000442
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000443 if (cwd)
444 POSIX_CALL(chdir(cwd));
445
446 if (restore_signals)
447 _Py_RestoreSignals();
448
449#ifdef HAVE_SETSID
450 if (call_setsid)
451 POSIX_CALL(setsid());
452#endif
453
Gregory P. Smith5591b022012-10-10 03:34:47 -0700454 reached_preexec = 1;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000455 if (preexec_fn != Py_None && preexec_fn_args_tuple) {
456 /* This is where the user has asked us to deadlock their program. */
457 result = PyObject_Call(preexec_fn, preexec_fn_args_tuple, NULL);
458 if (result == NULL) {
459 /* Stringifying the exception or traceback would involve
460 * memory allocation and thus potential for deadlock.
461 * We've already faced potential deadlock by calling back
462 * into Python in the first place, so it probably doesn't
463 * matter but we avoid it to minimize the possibility. */
464 err_msg = "Exception occurred in preexec_fn.";
465 errno = 0; /* We don't want to report an OSError. */
466 goto error;
467 }
468 /* Py_DECREF(result); - We're about to exec so why bother? */
469 }
470
Charles-François Natali249cdc32013-08-25 18:24:45 +0200471 /* close FDs after executing preexec_fn, which might open FDs */
472 if (close_fds) {
Charles-François Natali249cdc32013-08-25 18:24:45 +0200473 /* TODO HP-UX could use pstat_getproc() if anyone cares about it. */
Gregory P. Smithd4dcb702014-06-01 13:18:28 -0700474 _close_open_fds(3, py_fds_to_keep);
Charles-François Natali249cdc32013-08-25 18:24:45 +0200475 }
476
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000477 /* This loop matches the Lib/os.py _execvpe()'s PATH search when */
478 /* given the executable_list generated by Lib/subprocess.py. */
479 saved_errno = 0;
480 for (i = 0; exec_array[i] != NULL; ++i) {
481 const char *executable = exec_array[i];
482 if (envp) {
483 execve(executable, argv, envp);
484 } else {
485 execv(executable, argv);
486 }
487 if (errno != ENOENT && errno != ENOTDIR && saved_errno == 0) {
488 saved_errno = errno;
489 }
490 }
491 /* Report the first exec error, not the last. */
492 if (saved_errno)
493 errno = saved_errno;
494
495error:
496 saved_errno = errno;
497 /* Report the posix error to our parent process. */
Gregory P. Smith12fdca52012-01-21 12:31:25 -0800498 /* We ignore all write() return values as the total size of our writes is
Victor Stinner185fd332015-04-01 18:35:53 +0200499 less than PIPEBUF and we cannot do anything about an error anyways.
500 Use _Py_write_noraise() to retry write() if it is interrupted by a
501 signal (fails with EINTR). */
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000502 if (saved_errno) {
503 char *cur;
Victor Stinner185fd332015-04-01 18:35:53 +0200504 _Py_write_noraise(errpipe_write, "OSError:", 8);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000505 cur = hex_errno + sizeof(hex_errno);
506 while (saved_errno != 0 && cur > hex_errno) {
507 *--cur = "0123456789ABCDEF"[saved_errno % 16];
508 saved_errno /= 16;
509 }
Victor Stinner185fd332015-04-01 18:35:53 +0200510 _Py_write_noraise(errpipe_write, cur, hex_errno + sizeof(hex_errno) - cur);
511 _Py_write_noraise(errpipe_write, ":", 1);
Gregory P. Smith5591b022012-10-10 03:34:47 -0700512 if (!reached_preexec) {
513 /* Indicate to the parent that the error happened before exec(). */
Victor Stinner185fd332015-04-01 18:35:53 +0200514 _Py_write_noraise(errpipe_write, "noexec", 6);
Gregory P. Smith5591b022012-10-10 03:34:47 -0700515 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000516 /* We can't call strerror(saved_errno). It is not async signal safe.
517 * The parent process will look the error message up. */
518 } else {
Victor Stinner185fd332015-04-01 18:35:53 +0200519 _Py_write_noraise(errpipe_write, "SubprocessError:0:", 18);
520 _Py_write_noraise(errpipe_write, err_msg, strlen(err_msg));
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000521 }
522}
523
524
525static PyObject *
526subprocess_fork_exec(PyObject* self, PyObject *args)
527{
528 PyObject *gc_module = NULL;
Antoine Pitrou721738f2012-08-15 23:20:39 +0200529 PyObject *executable_list, *py_fds_to_keep;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000530 PyObject *env_list, *preexec_fn;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000531 PyObject *process_args, *converted_args = NULL, *fast_args = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000532 PyObject *preexec_fn_args_tuple = NULL;
533 int p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite;
534 int errpipe_read, errpipe_write, close_fds, restore_signals;
535 int call_setsid;
Victor Stinner0e59cc32010-04-16 23:49:32 +0000536 PyObject *cwd_obj, *cwd_obj2;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000537 const char *cwd;
538 pid_t pid;
539 int need_to_reenable_gc = 0;
540 char *const *exec_array, *const *argv = NULL, *const *envp = NULL;
Gregory P. Smith8facece2012-01-21 14:01:08 -0800541 Py_ssize_t arg_num;
Victor Stinner8f437aa2014-10-05 17:25:19 +0200542 int import_lock_held = 0;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000543
544 if (!PyArg_ParseTuple(
Antoine Pitrou721738f2012-08-15 23:20:39 +0200545 args, "OOpOOOiiiiiiiiiiO:fork_exec",
546 &process_args, &executable_list, &close_fds, &py_fds_to_keep,
Victor Stinner0e59cc32010-04-16 23:49:32 +0000547 &cwd_obj, &env_list,
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000548 &p2cread, &p2cwrite, &c2pread, &c2pwrite,
549 &errread, &errwrite, &errpipe_read, &errpipe_write,
550 &restore_signals, &call_setsid, &preexec_fn))
551 return NULL;
552
Gregory P. Smith361e30c2013-12-01 00:12:24 -0800553 if (close_fds && errpipe_write < 3) { /* precondition */
554 PyErr_SetString(PyExc_ValueError, "errpipe_write must be >= 3");
555 return NULL;
556 }
Gregory P. Smith8facece2012-01-21 14:01:08 -0800557 if (PySequence_Length(py_fds_to_keep) < 0) {
558 PyErr_SetString(PyExc_ValueError, "cannot get length of fds_to_keep");
559 return NULL;
560 }
561 if (_sanity_check_python_fd_sequence(py_fds_to_keep)) {
562 PyErr_SetString(PyExc_ValueError, "bad value(s) in fds_to_keep");
Gregory P. Smithd4cc7bf2010-12-04 11:22:11 +0000563 return NULL;
564 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000565
566 /* We need to call gc.disable() when we'll be calling preexec_fn */
567 if (preexec_fn != Py_None) {
568 PyObject *result;
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200569 _Py_IDENTIFIER(isenabled);
570 _Py_IDENTIFIER(disable);
Victor Stinnerdaf45552013-08-28 00:53:59 +0200571
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000572 gc_module = PyImport_ImportModule("gc");
573 if (gc_module == NULL)
574 return NULL;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200575 result = _PyObject_CallMethodId(gc_module, &PyId_isenabled, NULL);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000576 if (result == NULL) {
577 Py_DECREF(gc_module);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000578 return NULL;
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000579 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000580 need_to_reenable_gc = PyObject_IsTrue(result);
581 Py_DECREF(result);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000582 if (need_to_reenable_gc == -1) {
583 Py_DECREF(gc_module);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000584 return NULL;
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000585 }
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200586 result = _PyObject_CallMethodId(gc_module, &PyId_disable, NULL);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000587 if (result == NULL) {
588 Py_DECREF(gc_module);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000589 return NULL;
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000590 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000591 Py_DECREF(result);
592 }
593
594 exec_array = _PySequence_BytesToCharpArray(executable_list);
Victor Stinner8f437aa2014-10-05 17:25:19 +0200595 if (!exec_array)
596 goto cleanup;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000597
598 /* Convert args and env into appropriate arguments for exec() */
599 /* These conversions are done in the parent process to avoid allocating
600 or freeing memory in the child process. */
601 if (process_args != Py_None) {
Gregory P. Smith68f52172010-03-15 06:07:42 +0000602 Py_ssize_t num_args;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000603 /* Equivalent to: */
604 /* tuple(PyUnicode_FSConverter(arg) for arg in process_args) */
Gregory P. Smith68f52172010-03-15 06:07:42 +0000605 fast_args = PySequence_Fast(process_args, "argv must be a tuple");
Stefan Krahdb579d72012-08-20 14:36:47 +0200606 if (fast_args == NULL)
607 goto cleanup;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000608 num_args = PySequence_Fast_GET_SIZE(fast_args);
609 converted_args = PyTuple_New(num_args);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000610 if (converted_args == NULL)
611 goto cleanup;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000612 for (arg_num = 0; arg_num < num_args; ++arg_num) {
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000613 PyObject *borrowed_arg, *converted_arg;
Gregory P. Smith68f52172010-03-15 06:07:42 +0000614 borrowed_arg = PySequence_Fast_GET_ITEM(fast_args, arg_num);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000615 if (PyUnicode_FSConverter(borrowed_arg, &converted_arg) == 0)
616 goto cleanup;
617 PyTuple_SET_ITEM(converted_args, arg_num, converted_arg);
618 }
619
620 argv = _PySequence_BytesToCharpArray(converted_args);
621 Py_CLEAR(converted_args);
Gregory P. Smith68f52172010-03-15 06:07:42 +0000622 Py_CLEAR(fast_args);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000623 if (!argv)
624 goto cleanup;
625 }
626
627 if (env_list != Py_None) {
628 envp = _PySequence_BytesToCharpArray(env_list);
629 if (!envp)
630 goto cleanup;
631 }
632
633 if (preexec_fn != Py_None) {
634 preexec_fn_args_tuple = PyTuple_New(0);
635 if (!preexec_fn_args_tuple)
636 goto cleanup;
Victor Stinner0e59cc32010-04-16 23:49:32 +0000637 _PyImport_AcquireLock();
Victor Stinner8f437aa2014-10-05 17:25:19 +0200638 import_lock_held = 1;
Victor Stinner0e59cc32010-04-16 23:49:32 +0000639 }
640
641 if (cwd_obj != Py_None) {
642 if (PyUnicode_FSConverter(cwd_obj, &cwd_obj2) == 0)
643 goto cleanup;
Victor Stinnerdcb24032010-04-22 12:08:36 +0000644 cwd = PyBytes_AsString(cwd_obj2);
Victor Stinner0e59cc32010-04-16 23:49:32 +0000645 } else {
646 cwd = NULL;
647 cwd_obj2 = NULL;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000648 }
649
650 pid = fork();
651 if (pid == 0) {
652 /* Child process */
Victor Stinner0e59cc32010-04-16 23:49:32 +0000653 /*
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000654 * Code from here to _exit() must only use async-signal-safe functions,
655 * listed at `man 7 signal` or
656 * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
657 */
658
659 if (preexec_fn != Py_None) {
660 /* We'll be calling back into Python later so we need to do this.
661 * This call may not be async-signal-safe but neither is calling
662 * back into Python. The user asked us to use hope as a strategy
663 * to avoid deadlock... */
664 PyOS_AfterFork();
665 }
666
667 child_exec(exec_array, argv, envp, cwd,
668 p2cread, p2cwrite, c2pread, c2pwrite,
669 errread, errwrite, errpipe_read, errpipe_write,
670 close_fds, restore_signals, call_setsid,
Gregory P. Smith8facece2012-01-21 14:01:08 -0800671 py_fds_to_keep, preexec_fn, preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000672 _exit(255);
673 return NULL; /* Dead code to avoid a potential compiler warning. */
674 }
Victor Stinner0e59cc32010-04-16 23:49:32 +0000675 Py_XDECREF(cwd_obj2);
676
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000677 if (pid == -1) {
678 /* Capture the errno exception before errno can be clobbered. */
679 PyErr_SetFromErrno(PyExc_OSError);
680 }
681 if (preexec_fn != Py_None &&
682 _PyImport_ReleaseLock() < 0 && !PyErr_Occurred()) {
683 PyErr_SetString(PyExc_RuntimeError,
684 "not holding the import lock");
685 }
Victor Stinner8f437aa2014-10-05 17:25:19 +0200686 import_lock_held = 0;
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000687
688 /* Parent process */
689 if (envp)
690 _Py_FreeCharPArray(envp);
691 if (argv)
692 _Py_FreeCharPArray(argv);
693 _Py_FreeCharPArray(exec_array);
694
695 /* Reenable gc in the parent process (or if fork failed). */
696 if (need_to_reenable_gc && _enable_gc(gc_module)) {
697 Py_XDECREF(gc_module);
698 return NULL;
699 }
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000700 Py_XDECREF(preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000701 Py_XDECREF(gc_module);
702
703 if (pid == -1)
704 return NULL; /* fork() failed. Exception set earlier. */
705
706 return PyLong_FromPid(pid);
707
708cleanup:
Victor Stinner8f437aa2014-10-05 17:25:19 +0200709 if (import_lock_held)
710 _PyImport_ReleaseLock();
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000711 if (envp)
712 _Py_FreeCharPArray(envp);
713 if (argv)
714 _Py_FreeCharPArray(argv);
Victor Stinner8f437aa2014-10-05 17:25:19 +0200715 if (exec_array)
716 _Py_FreeCharPArray(exec_array);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000717 Py_XDECREF(converted_args);
Gregory P. Smith68f52172010-03-15 06:07:42 +0000718 Py_XDECREF(fast_args);
Gregory P. Smith32ec9da2010-03-19 16:53:08 +0000719 Py_XDECREF(preexec_fn_args_tuple);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000720
721 /* Reenable gc if it was disabled. */
Victor Stinner8f437aa2014-10-05 17:25:19 +0200722 if (need_to_reenable_gc) {
723 PyObject *exctype, *val, *tb;
724 PyErr_Fetch(&exctype, &val, &tb);
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000725 _enable_gc(gc_module);
Victor Stinner8f437aa2014-10-05 17:25:19 +0200726 PyErr_Restore(exctype, val, tb);
727 }
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000728 Py_XDECREF(gc_module);
729 return NULL;
730}
731
732
733PyDoc_STRVAR(subprocess_fork_exec_doc,
734"fork_exec(args, executable_list, close_fds, cwd, env,\n\
735 p2cread, p2cwrite, c2pread, c2pwrite,\n\
736 errread, errwrite, errpipe_read, errpipe_write,\n\
737 restore_signals, call_setsid, preexec_fn)\n\
738\n\
739Forks a child process, closes parent file descriptors as appropriate in the\n\
740child and dups the few that are needed before calling exec() in the child\n\
741process.\n\
742\n\
743The preexec_fn, if supplied, will be called immediately before exec.\n\
744WARNING: preexec_fn is NOT SAFE if your application uses threads.\n\
745 It may trigger infrequent, difficult to debug deadlocks.\n\
746\n\
747If an error occurs in the child process before the exec, it is\n\
748serialized and written to the errpipe_write fd per subprocess.py.\n\
749\n\
750Returns: the child process's PID.\n\
751\n\
752Raises: Only on an error in the parent process.\n\
753");
754
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000755/* module level code ********************************************************/
756
757PyDoc_STRVAR(module_doc,
758"A POSIX helper for the subprocess module.");
759
760
761static PyMethodDef module_methods[] = {
762 {"fork_exec", subprocess_fork_exec, METH_VARARGS, subprocess_fork_exec_doc},
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000763 {NULL, NULL} /* sentinel */
764};
765
766
767static struct PyModuleDef _posixsubprocessmodule = {
768 PyModuleDef_HEAD_INIT,
769 "_posixsubprocess",
770 module_doc,
771 -1, /* No memory is needed. */
772 module_methods,
773};
774
775PyMODINIT_FUNC
776PyInit__posixsubprocess(void)
777{
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000778 return PyModule_Create(&_posixsubprocessmodule);
779}