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 723f71abf7
)
Co-authored-by: Benoit Hudson <benoit@imgspc.com>
This commit is contained in:
parent
c9f480d2cc
commit
836cf31a3c
|
@ -725,6 +725,7 @@ Miro Hrončok
|
|||
Chiu-Hsiang Hsu
|
||||
Chih-Hao Huang
|
||||
Christian Hudon
|
||||
Benoît Hudson
|
||||
Lawrence Hudson
|
||||
Michael Hudson
|
||||
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.
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue