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.
This commit is contained in:
parent
e76ee1a72b
commit
723f71abf7
|
@ -733,6 +733,7 @@ Miro Hrončok
|
||||||
Chiu-Hsiang Hsu
|
Chiu-Hsiang Hsu
|
||||||
Chih-Hao Huang
|
Chih-Hao Huang
|
||||||
Christian Hudon
|
Christian Hudon
|
||||||
|
Benoît Hudson
|
||||||
Lawrence Hudson
|
Lawrence Hudson
|
||||||
Michael Hudson
|
Michael Hudson
|
||||||
Jim Hugunin
|
Jim Hugunin
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Fixed a crash on OSX dynamic builds that occurred when re-initializing the
|
||||||
|
posix module after a Py_Finalize if the environment had changed since the
|
||||||
|
previous `import posix`. Patch by Benoît Hudson.
|
|
@ -1402,7 +1402,6 @@ win32_get_reparse_tag(HANDLE reparse_point_handle, ULONG *reparse_tag)
|
||||||
** man environ(7).
|
** man environ(7).
|
||||||
*/
|
*/
|
||||||
#include <crt_externs.h>
|
#include <crt_externs.h>
|
||||||
static char **environ;
|
|
||||||
#elif !defined(_MSC_VER) && (!defined(__WATCOMC__) || defined(__QNX__) || defined(__VXWORKS__))
|
#elif !defined(_MSC_VER) && (!defined(__WATCOMC__) || defined(__QNX__) || defined(__VXWORKS__))
|
||||||
extern char **environ;
|
extern char **environ;
|
||||||
#endif /* !_MSC_VER */
|
#endif /* !_MSC_VER */
|
||||||
|
@ -1420,15 +1419,16 @@ convertenviron(void)
|
||||||
d = PyDict_New();
|
d = PyDict_New();
|
||||||
if (d == NULL)
|
if (d == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
#if defined(WITH_NEXT_FRAMEWORK) || (defined(__APPLE__) && defined(Py_ENABLE_SHARED))
|
|
||||||
if (environ == NULL)
|
|
||||||
environ = *_NSGetEnviron();
|
|
||||||
#endif
|
|
||||||
#ifdef MS_WINDOWS
|
#ifdef MS_WINDOWS
|
||||||
/* _wenviron must be initialized in this way if the program is started
|
/* _wenviron must be initialized in this way if the program is started
|
||||||
through main() instead of wmain(). */
|
through main() instead of wmain(). */
|
||||||
_wgetenv(L"");
|
_wgetenv(L"");
|
||||||
e = _wenviron;
|
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
|
#else
|
||||||
e = environ;
|
e = environ;
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue