Stop overridden environment variables leaking
Work around interesting (read: unexpected, stupid) behaviour of
os.environ:
>>> import os, copy
>>> "x" in os.environ
False
>>> copy.copy(os.environ) is os.environ
False
>>> copy.copy(os.environ)["x"] = "1"
>>> "x" in os.environ
True
Markus Gerstel
4 years ago
0 | 0 |
=======
|
1 | 1 |
History
|
2 | 2 |
=======
|
|
3 |
|
|
4 |
1.0.2 (2019-05-20)
|
|
5 |
------------------
|
|
6 |
|
|
7 |
* Stop environment override variables leaking into the process environment
|
3 | 8 |
|
4 | 9 |
1.0.1 (2019-04-16)
|
5 | 10 |
------------------
|
2 | 2 |
from __future__ import absolute_import, division, print_function
|
3 | 3 |
|
4 | 4 |
import codecs
|
5 | |
import copy
|
6 | 5 |
import logging
|
7 | 6 |
import os
|
8 | 7 |
import select
|
|
437 | 436 |
if environment is not None:
|
438 | 437 |
env = {key: _path_resolve(environment[key]) for key in environment}
|
439 | 438 |
else:
|
440 | |
env = os.environ
|
|
439 |
env = {key: value for key, value in os.environ.items()}
|
441 | 440 |
if environment_override:
|
442 | |
env = copy.copy(env)
|
443 | 441 |
env.update(
|
444 | 442 |
{
|
445 | 443 |
key: str(_path_resolve(environment_override[key]))
|
57 | 57 |
sentinel_value = b"sentinel"
|
58 | 58 |
tmpdir.join("tempfile").write(sentinel_value)
|
59 | 59 |
tmpdir.join("reader.py").write("print(open('tempfile').read())")
|
|
60 |
assert "LEAK_DETECTOR" not in os.environ
|
60 | 61 |
result = procrunner.run(
|
61 | 62 |
[sys.executable, tmpdir.join("reader.py")],
|
62 | |
environment_override={"PYTHONHASHSEED": "random"},
|
|
63 |
environment_override={"PYTHONHASHSEED": "random", "LEAK_DETECTOR": "1"},
|
63 | 64 |
working_directory=tmpdir,
|
64 | 65 |
)
|
65 | 66 |
assert result.returncode == 0
|
66 | 67 |
assert not result.stderr
|
67 | 68 |
assert sentinel_value == result.stdout.strip()
|
|
69 |
assert (
|
|
70 |
"LEAK_DETECTOR" not in os.environ
|
|
71 |
), "overridden environment variable leaked into parent process"
|