diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -4755,17 +4755,17 @@ int fsconvert_strdup(PyObject *o, EXECV_ #endif #if defined(HAVE_EXECV) || defined (HAVE_FEXECVE) static EXECV_CHAR** parse_envlist(PyObject* env, Py_ssize_t *envc_ptr) { Py_ssize_t i, pos, envc; PyObject *keys=NULL, *vals=NULL; - PyObject *key, *val, *keyval; + PyObject *key, *keyb, *val, *valb, *keyval; EXECV_CHAR **envlist; i = PyMapping_Size(env); if (i < 0) return NULL; envlist = PyMem_NEW(EXECV_CHAR *, i + 1); if (envlist == NULL) { PyErr_NoMemory(); @@ -4785,25 +4785,36 @@ parse_envlist(PyObject* env, Py_ssize_t } for (pos = 0; pos < i; pos++) { key = PyList_GetItem(keys, pos); val = PyList_GetItem(vals, pos); if (!key || !val) goto error; +#ifndef MS_WINDOWS + if (!PyUnicode_FSConverter(key, &keyb)) + goto error; + if (!PyUnicode_FSConverter(val, &valb)) + goto error; + keyval = PyBytes_FromFormat("%s=%s", + PyBytes_AsString(keyb), + PyBytes_AsString(valb)); +#else keyval = PyUnicode_FromFormat("%U=%U", key, val); +#endif if (!keyval) goto error; if (!fsconvert_strdup(keyval, &envlist[envc++])) { Py_DECREF(keyval); goto error; } - + Py_DECREF(keyb); + Py_DECREF(valb); Py_DECREF(keyval); } Py_DECREF(vals); Py_DECREF(keys); envlist[envc] = 0; *envc_ptr = envc; return envlist;