diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2017-12-15 00:39:48 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-12-15 00:39:48 (GMT) |
commit | 22097aaa77b4f0473552fe840358d77e5b9a253f (patch) | |
tree | d0c88308e105a22644230d8ec32a61791dd85bec | |
parent | d1cb1067a82b11280204e36b695e786a5a3ca221 (diff) | |
download | cpython-22097aaa77b4f0473552fe840358d77e5b9a253f.zip cpython-22097aaa77b4f0473552fe840358d77e5b9a253f.tar.gz cpython-22097aaa77b4f0473552fe840358d77e5b9a253f.tar.bz2 |
bpo-32329: Fix sys.flags.hash_randomization (#4875)
sys.flags.hash_randomization is now properly set to 0 when hash
randomization is turned off by PYTHONHASHSEED=0.
-rw-r--r-- | Lib/test/test_cmd_line.py | 9 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Core and Builtins/2017-12-15-00-55-35.bpo-32329.XL1O99.rst | 2 | ||||
-rw-r--r-- | Modules/main.c | 1 | ||||
-rw-r--r-- | Python/pylifecycle.c | 4 | ||||
-rw-r--r-- | Python/random.c | 3 |
5 files changed, 12 insertions, 7 deletions
diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py index ae2bcd4..98441b0 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -426,10 +426,15 @@ class CmdLineTest(unittest.TestCase): # Verify that sys.flags contains hash_randomization code = 'import sys; print("random is", sys.flags.hash_randomization)' - rc, out, err = assert_python_ok('-c', code) - self.assertEqual(rc, 0) + rc, out, err = assert_python_ok('-c', code, PYTHONHASHSEED='') self.assertIn(b'random is 1', out) + rc, out, err = assert_python_ok('-c', code, PYTHONHASHSEED='random') + self.assertIn(b'random is 1', out) + + rc, out, err = assert_python_ok('-c', code, PYTHONHASHSEED='0') + self.assertIn(b'random is 0', out) + def test_del___main__(self): # Issue #15001: PyRun_SimpleFileExFlags() did crash because it kept a # borrowed reference to the dict of __main__ module and later modify diff --git a/Misc/NEWS.d/next/Core and Builtins/2017-12-15-00-55-35.bpo-32329.XL1O99.rst b/Misc/NEWS.d/next/Core and Builtins/2017-12-15-00-55-35.bpo-32329.XL1O99.rst new file mode 100644 index 0000000..36ca84e --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2017-12-15-00-55-35.bpo-32329.XL1O99.rst @@ -0,0 +1,2 @@ +``sys.flags.hash_randomization`` is now properly set to 0 when hash +randomization is turned off by ``PYTHONHASHSEED=0``. diff --git a/Modules/main.c b/Modules/main.c index b0fb78f..3ac405c 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -394,7 +394,6 @@ Py_Main(int argc, wchar_t **argv) exit(1); } - Py_HashRandomizationFlag = 1; _PyRandom_Init(); PySys_ResetWarnOptions(); diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 640271f..ecfdfee 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -330,10 +330,6 @@ _Py_InitializeEx_Private(int install_sigs, int install_importlib) Py_OptimizeFlag = add_flag(Py_OptimizeFlag, p); if ((p = Py_GETENV("PYTHONDONTWRITEBYTECODE")) && *p != '\0') Py_DontWriteBytecodeFlag = add_flag(Py_DontWriteBytecodeFlag, p); - /* The variable is only tested for existence here; _PyRandom_Init will - check its value further. */ - if ((p = Py_GETENV("PYTHONHASHSEED")) && *p != '\0') - Py_HashRandomizationFlag = add_flag(Py_HashRandomizationFlag, p); #ifdef MS_WINDOWS if ((p = Py_GETENV("PYTHONLEGACYWINDOWSFSENCODING")) && *p != '\0') Py_LegacyWindowsFSEncodingFlag = add_flag(Py_LegacyWindowsFSEncodingFlag, p); diff --git a/Python/random.c b/Python/random.c index c97d5e7..e0ee153 100644 --- a/Python/random.c +++ b/Python/random.c @@ -565,9 +565,11 @@ _PyRandom_Init(void) if (seed == 0) { /* disable the randomized hash */ memset(secret, 0, secret_size); + Py_HashRandomizationFlag = 0; } else { lcg_urandom(seed, secret, secret_size); + Py_HashRandomizationFlag = 1; } } else { @@ -582,6 +584,7 @@ _PyRandom_Init(void) if (res < 0) { Py_FatalError("failed to get random numbers to initialize Python"); } + Py_HashRandomizationFlag = 1; } } |