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.
This commit is contained in:
Victor Stinner 2010-04-16 23:49:32 +00:00
parent 9c0e94f95c
commit 0e59cc3fc3
2 changed files with 23 additions and 4 deletions

View File

@ -315,6 +315,9 @@ C-API
Library
-------
- Issue #8393: subprocess accepts bytes, bytearray and str with surrogates for
the current working directory.
- Issue #7606: XML-RPC traceback stored in X-traceback is now encoded to ASCII
using backslashreplace error handler

View File

@ -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,7 +265,19 @@ 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();
@ -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);