diff Modules/main.c @ 75142:0e8bd4785ea0 3.2

Fix test failure in test_cmd_line by initializing the hash secret at the earliest point.
author Antoine Pitrou <solipsis@pitrou.net>
date Tue, 21 Feb 2012 19:03:47 +0100
parents 4a31f6b11e7a
children e832ffd0388f 88aede44ded1
line wrap: on
line diff
--- a/Modules/main.c	Tue Feb 21 18:06:22 2012 +0100
+++ b/Modules/main.c	Tue Feb 21 19:03:47 2012 +0100
@@ -337,7 +337,33 @@
     orig_argc = argc;           /* For Py_GetArgcArgv() */
     orig_argv = argv;
 
+    /* Hash randomization needed early for all string operations
+       (including -W and -X options). */
+    while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
+        if (c == 'm' || c == 'c') {
+            /* -c / -m is the last option: following arguments are
+               not interpreter options. */
+            break;
+        }
+        switch (c) {
+        case 'E':
+            Py_IgnoreEnvironmentFlag++;
+            break;
+        case 'R':
+            Py_HashRandomizationFlag++;
+            break;
+        }
+    }
+    /* The variable is only tested for existence here; _PyRandom_Init will
+       check its value further. */
+    if (!Py_HashRandomizationFlag &&
+        (p = Py_GETENV("PYTHONHASHSEED")) && *p != '\0')
+        Py_HashRandomizationFlag = 1;
+
+    _PyRandom_Init();
+
     PySys_ResetWarnOptions();
+    _PyOS_ResetGetOpt();
 
     while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
         if (c == 'c') {
@@ -398,7 +424,7 @@
             break;
 
         case 'E':
-            Py_IgnoreEnvironmentFlag++;
+            /* Already handled above */
             break;
 
         case 't':
@@ -440,7 +466,7 @@
             break;
 
         case 'R':
-            Py_HashRandomizationFlag++;
+            /* Already handled above */
             break;
 
         /* This space reserved for other options */