diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2019-12-06 19:32:33 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-12-06 19:32:33 (GMT) |
commit | 836cf31a3cf468ed9598a220b8e194b366287bfe (patch) | |
tree | d8786067ffb5bc34e0af80564e0912f961547ba8 /Modules/posixmodule.c | |
parent | c9f480d2ccda9de46584cabe086f0acfa45f2faf (diff) | |
download | cpython-836cf31a3cf468ed9598a220b8e194b366287bfe.zip cpython-836cf31a3cf468ed9598a220b8e194b366287bfe.tar.gz cpython-836cf31a3cf468ed9598a220b8e194b366287bfe.tar.bz2 |
bpo-37931: Fix crash on OSX re-initializing os.environ (GH-15428)
On most platforms, the `environ` symbol is accessible everywhere.
In a dylib on OSX, it's not easily accessible, you need to find it with
_NSGetEnviron.
The code was caching the *value* of environ. But a setenv() can change the value,
leaving garbage at the old value. Fix: don't cache the value of environ, just
read it every time.
(cherry picked from commit 723f71abf7ab0a7be394f9f7b2daa9ecdf6fb1eb)
Co-authored-by: Benoit Hudson <benoit@imgspc.com>
Diffstat (limited to 'Modules/posixmodule.c')
-rw-r--r-- | Modules/posixmodule.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 7c82343..850769f 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -1372,7 +1372,6 @@ win32_get_reparse_tag(HANDLE reparse_point_handle, ULONG *reparse_tag) ** man environ(7). */ #include <crt_externs.h> -static char **environ; #elif !defined(_MSC_VER) && (!defined(__WATCOMC__) || defined(__QNX__) || defined(__VXWORKS__)) extern char **environ; #endif /* !_MSC_VER */ @@ -1390,15 +1389,16 @@ convertenviron(void) d = PyDict_New(); if (d == NULL) return NULL; -#if defined(WITH_NEXT_FRAMEWORK) || (defined(__APPLE__) && defined(Py_ENABLE_SHARED)) - if (environ == NULL) - environ = *_NSGetEnviron(); -#endif #ifdef MS_WINDOWS /* _wenviron must be initialized in this way if the program is started through main() instead of wmain(). */ _wgetenv(L""); e = _wenviron; +#elif defined(WITH_NEXT_FRAMEWORK) || (defined(__APPLE__) && defined(Py_ENABLE_SHARED)) + /* environ is not accessible as an extern in a shared object on OSX; use + _NSGetEnviron to resolve it. The value changes if you add environment + variables between calls to Py_Initialize, so don't cache the value. */ + e = *_NSGetEnviron(); #else e = environ; #endif |