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:
Victor Stinner 2011-06-20 14:45:54 +02:00
parent d6b3840e7d
commit 99563b1df8
1 changed files with 9 additions and 7 deletions

View File

@ -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);
} }