From 044cf94f610e831464a69a8e713dad89878824ce Mon Sep 17 00:00:00 2001 From: Ronald Oussoren Date: Sun, 22 Mar 2020 19:31:46 +0100 Subject: [PATCH] bpo-22490: Remove __PYVENV_LAUNCHER__ from environment during launch (GH-9516) * bpo-22490: Remove "__PYVENV_LAUNCHER__" from the shell environment on macOS This changeset removes the environment varialbe "__PYVENV_LAUNCHER__" during interpreter launch as it is only needed to communicate between the stub executable in framework installs and the actual interpreter. Leaving the environment variable present may lead to misbehaviour when launching other scripts. * Actually commit the changes for issue 22490... * Correct typo Co-Authored-By: Nicola Soranzo * Run make patchcheck Co-authored-by: Jason R. Coombs Co-authored-by: Nicola Soranzo --- Lib/test/test_subprocess.py | 1 - Lib/test/test_venv.py | 12 ++++++++++++ Mac/Tools/pythonw.c | 9 +++++++++ .../2018-09-23-16-32-58.bpo-22490.8e0YDf.rst | 2 ++ Python/initconfig.c | 11 +++++++++++ 5 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-09-23-16-32-58.bpo-22490.8e0YDf.rst diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index 1cebf6b24a6..868f2798394 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -682,7 +682,6 @@ class ProcessTestCase(BaseTestCase): # on adding even when the environment in exec is empty. # Gentoo sandboxes also force LD_PRELOAD and SANDBOX_* to exist. return ('VERSIONER' in n or '__CF' in n or # MacOS - '__PYVENV_LAUNCHER__' in n or # MacOS framework build n == 'LD_PRELOAD' or n.startswith('SANDBOX') or # Gentoo n == 'LC_CTYPE') # Locale coercion triggered diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index a3b78c4e44e..b2794cd992a 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -391,6 +391,18 @@ class BasicTest(BaseTest): self.assertEqual(err, "".encode()) + @unittest.skipUnless(sys.platform == 'darwin', 'only relevant on macOS') + def test_macos_env(self): + rmtree(self.env_dir) + builder = venv.EnvBuilder() + builder.create(self.env_dir) + + envpy = os.path.join(os.path.realpath(self.env_dir), + self.bindir, self.exe) + out, err = check_output([envpy, '-c', + 'import os; print("__PYVENV_LAUNCHER__" in os.environ)']) + self.assertEqual(out.strip(), 'False'.encode()) + @requireVenvCreate class EnsurePipTest(BaseTest): """Test venv module installation of pip.""" diff --git a/Mac/Tools/pythonw.c b/Mac/Tools/pythonw.c index 1d2db383f94..c8bd3ba8d68 100644 --- a/Mac/Tools/pythonw.c +++ b/Mac/Tools/pythonw.c @@ -196,6 +196,15 @@ main(int argc, char **argv) { } } + /* + * The environment variable is used to pass the value of real_path + * to the actual python interpreter, and is read by code in + * Python/coreconfig.c. + * + * This way the real interpreter knows how the user invoked the + * interpreter and can behave as if this launcher is the real + * interpreter (looking for pyvenv configuration, ...) + */ setenv("__PYVENV_LAUNCHER__", real_path, 1); } diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-09-23-16-32-58.bpo-22490.8e0YDf.rst b/Misc/NEWS.d/next/Core and Builtins/2018-09-23-16-32-58.bpo-22490.8e0YDf.rst new file mode 100644 index 00000000000..a281f024249 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2018-09-23-16-32-58.bpo-22490.8e0YDf.rst @@ -0,0 +1,2 @@ +Don't leak environment variable ``__PYVENV_LAUNCHER__`` into the interpreter +session on macOS. diff --git a/Python/initconfig.c b/Python/initconfig.c index 19070d2a3fa..7bad36ef17b 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -1139,6 +1139,17 @@ config_init_program_name(PyConfig *config) if (_PyStatus_EXCEPTION(status)) { return status; } + + /* + * This environment variable is used to communicate between + * the stub launcher and the real interpreter and isn't needed + * beyond this point. + * + * Clean up to avoid problems when launching other programs + * later on. + */ + (void)unsetenv("__PYVENV_LAUNCHER__"); + return _PyStatus_OK(); } }