diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2010-04-16 23:49:32 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2010-04-16 23:49:32 (GMT) |
commit | 0e59cc3fc347582d8625050de258a2dd6b87f978 (patch) | |
tree | a331216b541d0671cabc8328902e2f9c7487ce8e /Modules | |
parent | 9c0e94f95cb7c72da3554ead8b5b255455e6caae (diff) | |
download | cpython-0e59cc3fc347582d8625050de258a2dd6b87f978.zip cpython-0e59cc3fc347582d8625050de258a2dd6b87f978.tar.gz cpython-0e59cc3fc347582d8625050de258a2dd6b87f978.tar.bz2 |
Issue #8393: subprocess accepts bytes, bytearray and str with surrogates for
the current working directory.
Remove also a trailing space, and replace tabulation indentation by spaces.
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_posixsubprocess.c | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c index a6008ef..24a70bc 100644 --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -177,6 +177,7 @@ subprocess_fork_exec(PyObject* self, PyObject *args) int p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite; int errpipe_read, errpipe_write, close_fds, restore_signals; int call_setsid; + PyObject *cwd_obj, *cwd_obj2; const char *cwd; pid_t pid; int need_to_reenable_gc = 0; @@ -184,8 +185,9 @@ subprocess_fork_exec(PyObject* self, PyObject *args) Py_ssize_t arg_num; if (!PyArg_ParseTuple( - args, "OOOzOiiiiiiiiiiO:fork_exec", - &process_args, &executable_list, &py_close_fds, &cwd, &env_list, + args, "OOOOOiiiiiiiiiiO:fork_exec", + &process_args, &executable_list, &py_close_fds, + &cwd_obj, &env_list, &p2cread, &p2cwrite, &c2pread, &c2pwrite, &errread, &errwrite, &errpipe_read, &errpipe_write, &restore_signals, &call_setsid, &preexec_fn)) @@ -263,13 +265,25 @@ subprocess_fork_exec(PyObject* self, PyObject *args) preexec_fn_args_tuple = PyTuple_New(0); if (!preexec_fn_args_tuple) goto cleanup; - _PyImport_AcquireLock(); + _PyImport_AcquireLock(); + } + + if (cwd_obj != Py_None) { + if (PyUnicode_FSConverter(cwd_obj, &cwd_obj2) == 0) + goto cleanup; + if (PyBytes_Check(cwd_obj2)) + cwd = PyBytes_AS_STRING(cwd_obj2); + else + cwd = PyByteArray_AS_STRING(cwd_obj2); + } else { + cwd = NULL; + cwd_obj2 = NULL; } pid = fork(); if (pid == 0) { /* Child process */ - /* + /* * Code from here to _exit() must only use async-signal-safe functions, * listed at `man 7 signal` or * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html. @@ -291,6 +305,8 @@ subprocess_fork_exec(PyObject* self, PyObject *args) _exit(255); return NULL; /* Dead code to avoid a potential compiler warning. */ } + Py_XDECREF(cwd_obj2); + if (pid == -1) { /* Capture the errno exception before errno can be clobbered. */ PyErr_SetFromErrno(PyExc_OSError); |