Index: PC/_subprocess.c =================================================================== --- PC/_subprocess.c (revision 61164) +++ PC/_subprocess.c (working copy) @@ -355,35 +355,69 @@ return NULL; } +/* Function suitable for O& conversion */ +static int +convert_to_unicode(PyObject *arg, void *_param) +{ + wchar_t **param = (wchar_t**)_param; + if (arg == Py_None) { + *param = NULL; + return 1; + } + else if (PyUnicode_Check(arg)) { + Py_INCREF(arg); + } + else { + arg = PyUnicode_FromEncodedObject(arg, + Py_FileSystemDefaultEncoding, + "strict"); + if (arg == NULL) + return 0; + } + *param = _wcsdup(PyUnicode_AS_UNICODE(arg)); + Py_DECREF(arg); + if (*param == NULL) + PyErr_NoMemory(); + return *param != NULL; +} + +static void +safe_free(void* p) +{ + if (p) free(p); +} + static PyObject * sp_CreateProcess(PyObject* self, PyObject* args) { BOOL result; PROCESS_INFORMATION pi; - STARTUPINFO si; + STARTUPINFOW si; PyObject* environment; - char* application_name; - char* command_line; + wchar_t* application_name = NULL; + wchar_t* command_line = NULL; PyObject* process_attributes; /* ignored */ PyObject* thread_attributes; /* ignored */ int inherit_handles; int creation_flags; PyObject* env_mapping; - char* current_directory; + wchar_t* current_directory = NULL; PyObject* startup_info; - if (! PyArg_ParseTuple(args, "zzOOiiOzO:CreateProcess", - &application_name, - &command_line, + PyObject* value = NULL; + + if (! PyArg_ParseTuple(args, "O&O&OOiiOO&O:CreateProcess", + convert_to_unicode, &application_name, + convert_to_unicode, &command_line, &process_attributes, &thread_attributes, &inherit_handles, &creation_flags, &env_mapping, - ¤t_directory, + convert_to_unicode, ¤t_directory, &startup_info)) - return NULL; + goto error; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); @@ -396,39 +430,46 @@ si.hStdError = gethandle(startup_info, "hStdError"); if (PyErr_Occurred()) - return NULL; + goto error; if (env_mapping == Py_None) environment = NULL; else { environment = getenvironment(env_mapping); if (! environment) - return NULL; + goto error; } Py_BEGIN_ALLOW_THREADS - result = CreateProcess(application_name, - command_line, - NULL, - NULL, - inherit_handles, - creation_flags, - environment ? PyString_AS_STRING(environment) : NULL, - current_directory, - &si, - &pi); + result = CreateProcessW(application_name, + command_line, + NULL, + NULL, + inherit_handles, + creation_flags, + environment ? PyString_AS_STRING(environment) : NULL, + current_directory, + &si, + &pi); Py_END_ALLOW_THREADS Py_XDECREF(environment); - if (! result) - return PyErr_SetFromWindowsErr(GetLastError()); + if (result) + value = Py_BuildValue("NNii", + sp_handle_new(pi.hProcess), + sp_handle_new(pi.hThread), + pi.dwProcessId, + pi.dwThreadId); + else + value = PyErr_SetFromWindowsErr(GetLastError()); - return Py_BuildValue("NNii", - sp_handle_new(pi.hProcess), - sp_handle_new(pi.hThread), - pi.dwProcessId, - pi.dwThreadId); +error: + safe_free(application_name); + safe_free(command_line); + safe_free(current_directory); + + return value; } static PyObject *