Skip to content

Commit

Permalink
bpo-22490: Remove __PYVENV_LAUNCHER__ from environment during launch (p…
Browse files Browse the repository at this point in the history
…ythonGH-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 <[email protected]>

* Run make patchcheck

Co-authored-by: Jason R. Coombs <[email protected]>
Co-authored-by: Nicola Soranzo <[email protected]>
(cherry picked from commit 044cf94)

Co-authored-by: Ronald Oussoren <[email protected]>
  • Loading branch information
ronaldoussoren authored and miss-islington committed Mar 22, 2020
1 parent 687f592 commit 8ac2cd8
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 1 deletion.
1 change: 0 additions & 1 deletion Lib/test/test_subprocess.py
Original file line number Diff line number Diff line change
Expand Up @@ -682,7 +682,6 @@ def is_env_var_to_ignore(n):
# 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

Expand Down
12 changes: 12 additions & 0 deletions Lib/test/test_venv.py
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,18 @@ def test_deactivate_with_strict_bash_opts(self):
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."""
Expand Down
9 changes: 9 additions & 0 deletions Mac/Tools/pythonw.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Don't leak environment variable ``__PYVENV_LAUNCHER__`` into the interpreter
session on macOS.
11 changes: 11 additions & 0 deletions Python/initconfig.c
Original file line number Diff line number Diff line change
Expand Up @@ -1144,6 +1144,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();
}
}
Expand Down

0 comments on commit 8ac2cd8

Please sign in to comment.