Unverified Kaydet (Commit) 22097aaa authored tarafından Victor Stinner's avatar Victor Stinner Kaydeden (comit) GitHub

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.
üst d1cb1067
...@@ -426,10 +426,15 @@ class CmdLineTest(unittest.TestCase): ...@@ -426,10 +426,15 @@ class CmdLineTest(unittest.TestCase):
# Verify that sys.flags contains hash_randomization # Verify that sys.flags contains hash_randomization
code = 'import sys; print("random is", sys.flags.hash_randomization)' code = 'import sys; print("random is", sys.flags.hash_randomization)'
rc, out, err = assert_python_ok('-c', code) rc, out, err = assert_python_ok('-c', code, PYTHONHASHSEED='')
self.assertEqual(rc, 0)
self.assertIn(b'random is 1', out) 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): def test_del___main__(self):
# Issue #15001: PyRun_SimpleFileExFlags() did crash because it kept a # Issue #15001: PyRun_SimpleFileExFlags() did crash because it kept a
# borrowed reference to the dict of __main__ module and later modify # borrowed reference to the dict of __main__ module and later modify
......
``sys.flags.hash_randomization`` is now properly set to 0 when hash
randomization is turned off by ``PYTHONHASHSEED=0``.
...@@ -394,7 +394,6 @@ Py_Main(int argc, wchar_t **argv) ...@@ -394,7 +394,6 @@ Py_Main(int argc, wchar_t **argv)
exit(1); exit(1);
} }
Py_HashRandomizationFlag = 1;
_PyRandom_Init(); _PyRandom_Init();
PySys_ResetWarnOptions(); PySys_ResetWarnOptions();
......
...@@ -330,10 +330,6 @@ _Py_InitializeEx_Private(int install_sigs, int install_importlib) ...@@ -330,10 +330,6 @@ _Py_InitializeEx_Private(int install_sigs, int install_importlib)
Py_OptimizeFlag = add_flag(Py_OptimizeFlag, p); Py_OptimizeFlag = add_flag(Py_OptimizeFlag, p);
if ((p = Py_GETENV("PYTHONDONTWRITEBYTECODE")) && *p != '\0') if ((p = Py_GETENV("PYTHONDONTWRITEBYTECODE")) && *p != '\0')
Py_DontWriteBytecodeFlag = add_flag(Py_DontWriteBytecodeFlag, p); 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 #ifdef MS_WINDOWS
if ((p = Py_GETENV("PYTHONLEGACYWINDOWSFSENCODING")) && *p != '\0') if ((p = Py_GETENV("PYTHONLEGACYWINDOWSFSENCODING")) && *p != '\0')
Py_LegacyWindowsFSEncodingFlag = add_flag(Py_LegacyWindowsFSEncodingFlag, p); Py_LegacyWindowsFSEncodingFlag = add_flag(Py_LegacyWindowsFSEncodingFlag, p);
......
...@@ -565,9 +565,11 @@ _PyRandom_Init(void) ...@@ -565,9 +565,11 @@ _PyRandom_Init(void)
if (seed == 0) { if (seed == 0) {
/* disable the randomized hash */ /* disable the randomized hash */
memset(secret, 0, secret_size); memset(secret, 0, secret_size);
Py_HashRandomizationFlag = 0;
} }
else { else {
lcg_urandom(seed, secret, secret_size); lcg_urandom(seed, secret, secret_size);
Py_HashRandomizationFlag = 1;
} }
} }
else { else {
...@@ -582,6 +584,7 @@ _PyRandom_Init(void) ...@@ -582,6 +584,7 @@ _PyRandom_Init(void)
if (res < 0) { if (res < 0) {
Py_FatalError("failed to get random numbers to initialize Python"); Py_FatalError("failed to get random numbers to initialize Python");
} }
Py_HashRandomizationFlag = 1;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment