diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2011-06-20 12:45:54 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2011-06-20 12:45:54 (GMT) |
commit | 99563b1df835218fd61fe1c86930b49dd55044be (patch) | |
tree | 7adb4e45099ead94777bc6e19285d45aa4250ec4 /Modules/getpath.c | |
parent | d6b3840e7d8cce39996d365a8fd05a7849cbef63 (diff) | |
download | cpython-99563b1df835218fd61fe1c86930b49dd55044be.zip cpython-99563b1df835218fd61fe1c86930b49dd55044be.tar.gz cpython-99563b1df835218fd61fe1c86930b49dd55044be.tar.bz2 |
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.
Diffstat (limited to 'Modules/getpath.c')
-rw-r--r-- | Modules/getpath.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/Modules/getpath.c b/Modules/getpath.c index b7f9573..7090879 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -406,7 +406,7 @@ calculate_path(void) static wchar_t delimiter[2] = {DELIM, '\0'}; static wchar_t separator[2] = {SEP, '\0'}; 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(); char *_path = getenv("PATH"); wchar_t *path_buffer = NULL; @@ -606,12 +606,12 @@ calculate_path(void) bufsz = 0; if (_rtpypath) { - size_t s = mbstowcs(rtpypath, _rtpypath, sizeof(rtpypath)/sizeof(wchar_t)); - if (s == (size_t)-1 || s >=sizeof(rtpypath)) - /* XXX deal with errors more gracefully */ + size_t rtpypath_len; + rtpypath = _Py_char2wchar(_rtpypath, &rtpypath_len); + if (rtpypath != NULL) + bufsz += rtpypath_len + 1; + else _rtpypath = NULL; - if (_rtpypath) - bufsz += wcslen(rtpypath) + 1; } defpath = _pythonpath; @@ -645,7 +645,7 @@ calculate_path(void) } else { /* Run-time value of $PYTHONPATH goes first */ - if (_rtpypath) { + if (rtpypath) { wcscpy(buf, rtpypath); wcscat(buf, delimiter); } @@ -719,6 +719,8 @@ calculate_path(void) PyMem_Free(_pythonpath); PyMem_Free(_prefix); PyMem_Free(_exec_prefix); + if (rtpypath != NULL) + PyMem_Free(rtpypath); } |