Index: Modules/_posixsubprocess.c =================================================================== --- Modules/_posixsubprocess.c (révision 80063) +++ Modules/_posixsubprocess.c (copie de travail) @@ -177,6 +177,7 @@ int p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite; int errpipe_read, errpipe_write, close_fds, restore_signals; int call_setsid; + PyObject *cwd_obj, *cwd_obj2 = NULL; const char *cwd; pid_t pid; int need_to_reenable_gc = 0; @@ -184,8 +185,9 @@ 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)) @@ -266,10 +268,20 @@ _PyImport_AcquireLock(); } + if (cwd_obj != Py_None) + { + if (PyUnicode_FSConverter(cwd_obj, &cwd_obj2) == 0) + goto cleanup; + assert(PyBytes_Check(cwd_obj2)); + cwd = PyBytes_AsString(cwd_obj2); + } else { + cwd = 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 +303,9 @@ _exit(255); return NULL; /* Dead code to avoid a potential compiler warning. */ } + if (cwd_obj2 != NULL) + Py_DECREF(cwd_obj2); + if (pid == -1) { /* Capture the errno exception before errno can be clobbered. */ PyErr_SetFromErrno(PyExc_OSError);