calculate_path() decodes the PYTHONPATH environment variable from the locale
encoding using _Py_char2wchar() instead of mbstowcs() to store undecodable bytes as surrogates characters (PEP 383) instead of ignoring silently the PYTHONPATH variable.
This commit is contained in:
parent
d6b3840e7d
commit
99563b1df8
|
@ -406,7 +406,7 @@ calculate_path(void)
|
||||||
static wchar_t delimiter[2] = {DELIM, '\0'};
|
static wchar_t delimiter[2] = {DELIM, '\0'};
|
||||||
static wchar_t separator[2] = {SEP, '\0'};
|
static wchar_t separator[2] = {SEP, '\0'};
|
||||||
char *_rtpypath = Py_GETENV("PYTHONPATH"); /* XXX use wide version on Windows */
|
char *_rtpypath = Py_GETENV("PYTHONPATH"); /* XXX use wide version on Windows */
|
||||||
wchar_t rtpypath[MAXPATHLEN+1];
|
wchar_t *rtpypath = NULL;
|
||||||
wchar_t *home = Py_GetPythonHome();
|
wchar_t *home = Py_GetPythonHome();
|
||||||
char *_path = getenv("PATH");
|
char *_path = getenv("PATH");
|
||||||
wchar_t *path_buffer = NULL;
|
wchar_t *path_buffer = NULL;
|
||||||
|
@ -606,12 +606,12 @@ calculate_path(void)
|
||||||
bufsz = 0;
|
bufsz = 0;
|
||||||
|
|
||||||
if (_rtpypath) {
|
if (_rtpypath) {
|
||||||
size_t s = mbstowcs(rtpypath, _rtpypath, sizeof(rtpypath)/sizeof(wchar_t));
|
size_t rtpypath_len;
|
||||||
if (s == (size_t)-1 || s >=sizeof(rtpypath))
|
rtpypath = _Py_char2wchar(_rtpypath, &rtpypath_len);
|
||||||
/* XXX deal with errors more gracefully */
|
if (rtpypath != NULL)
|
||||||
|
bufsz += rtpypath_len + 1;
|
||||||
|
else
|
||||||
_rtpypath = NULL;
|
_rtpypath = NULL;
|
||||||
if (_rtpypath)
|
|
||||||
bufsz += wcslen(rtpypath) + 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
defpath = _pythonpath;
|
defpath = _pythonpath;
|
||||||
|
@ -645,7 +645,7 @@ calculate_path(void)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* Run-time value of $PYTHONPATH goes first */
|
/* Run-time value of $PYTHONPATH goes first */
|
||||||
if (_rtpypath) {
|
if (rtpypath) {
|
||||||
wcscpy(buf, rtpypath);
|
wcscpy(buf, rtpypath);
|
||||||
wcscat(buf, delimiter);
|
wcscat(buf, delimiter);
|
||||||
}
|
}
|
||||||
|
@ -719,6 +719,8 @@ calculate_path(void)
|
||||||
PyMem_Free(_pythonpath);
|
PyMem_Free(_pythonpath);
|
||||||
PyMem_Free(_prefix);
|
PyMem_Free(_prefix);
|
||||||
PyMem_Free(_exec_prefix);
|
PyMem_Free(_exec_prefix);
|
||||||
|
if (rtpypath != NULL)
|
||||||
|
PyMem_Free(rtpypath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue