summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2017-12-15 00:39:48 (GMT)
committerGitHub <noreply@github.com>2017-12-15 00:39:48 (GMT)
commit22097aaa77b4f0473552fe840358d77e5b9a253f (patch)
treed0c88308e105a22644230d8ec32a61791dd85bec
parentd1cb1067a82b11280204e36b695e786a5a3ca221 (diff)
downloadcpython-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.py9
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2017-12-15-00-55-35.bpo-32329.XL1O99.rst2
-rw-r--r--Modules/main.c1
-rw-r--r--Python/pylifecycle.c4
-rw-r--r--Python/random.c3
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;
}
}