]> granicus.if.org Git - python/commitdiff
Fix test failure in test_cmd_line by initializing the hash secret at the earliest...
authorAntoine Pitrou <solipsis@pitrou.net>
Tue, 21 Feb 2012 18:03:47 +0000 (19:03 +0100)
committerAntoine Pitrou <solipsis@pitrou.net>
Tue, 21 Feb 2012 18:03:47 +0000 (19:03 +0100)
Include/pygetopt.h
Include/pythonrun.h
Modules/main.c
Python/getopt.c
Python/pythonrun.c

index 4de8c0045d9366f2ff77668c83713bcd3c30ed76..425c7dd6546e937c84a188e51a79a1c8a8117ad6 100644 (file)
@@ -9,6 +9,8 @@ extern "C" {
 PyAPI_DATA(int) _PyOS_opterr;
 PyAPI_DATA(int) _PyOS_optind;
 PyAPI_DATA(wchar_t *) _PyOS_optarg;
+
+PyAPI_FUNC(void) _PyOS_ResetGetOpt(void);
 #endif
 
 PyAPI_FUNC(int) _PyOS_GetOpt(int argc, wchar_t **argv, wchar_t *optstring);
index 5054932596843e3abaacc1be57580ea22ce3092f..e244ce713b08131ec8e12fd33b0406d0272f240e 100644 (file)
@@ -196,6 +196,7 @@ PyAPI_FUNC(void) _PyImportHooks_Init(void);
 PyAPI_FUNC(int) _PyFrame_Init(void);
 PyAPI_FUNC(void) _PyFloat_Init(void);
 PyAPI_FUNC(int) PyByteArray_Init(void);
+PyAPI_FUNC(void) _PyRandom_Init(void);
 #endif
 
 /* Various internal finalizers */
index ed84aa028604600dc8c3cc59cf088d752dcc89c6..6b2d0f5fa84411ce66e6ff85ba2e6738d26df5b1 100644 (file)
@@ -337,7 +337,33 @@ Py_Main(int argc, wchar_t **argv)
     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 @@ Py_Main(int argc, wchar_t **argv)
             break;
 
         case 'E':
-            Py_IgnoreEnvironmentFlag++;
+            /* Already handled above */
             break;
 
         case 't':
@@ -440,7 +466,7 @@ Py_Main(int argc, wchar_t **argv)
             break;
 
         case 'R':
-            Py_HashRandomizationFlag++;
+            /* Already handled above */
             break;
 
         /* This space reserved for other options */
index 064a1874ea5860719e0bc7d88e7c68cfca6a23a4..cc424312fe93c456c0bcc103f260bc09fb638f18 100644 (file)
@@ -41,9 +41,18 @@ int _PyOS_opterr = 1;          /* generate error messages */
 int _PyOS_optind = 1;          /* index into argv array   */
 wchar_t *_PyOS_optarg = NULL;     /* optional argument       */
 
+static wchar_t *opt_ptr = L"";
+
+void _PyOS_ResetGetOpt(void)
+{
+    _PyOS_opterr = 1;
+    _PyOS_optind = 1;
+    _PyOS_optarg = NULL;
+    opt_ptr = L"";
+}
+
 int _PyOS_GetOpt(int argc, wchar_t **argv, wchar_t *optstring)
 {
-    static wchar_t *opt_ptr = L"";
     wchar_t *ptr;
     wchar_t option;
 
index 718362d479229c56e9abe221bdb25e9137768823..584a19b426b60c13bb731a0b93bb12b5b93bf539 100644 (file)
@@ -70,7 +70,6 @@ extern void _PyUnicode_Init(void);
 extern void _PyUnicode_Fini(void);
 extern int _PyLong_Init(void);
 extern void PyLong_Fini(void);
-extern void _PyRandom_Init(void);
 
 #ifdef WITH_THREAD
 extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *);