]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Fix crash at startup with -W options.
authorAntoine Pitrou <solipsis@pitrou.net>
Tue, 21 Feb 2012 19:42:48 +0000 (20:42 +0100)
committerAntoine Pitrou <solipsis@pitrou.net>
Tue, 21 Feb 2012 19:42:48 +0000 (20:42 +0100)
Include/pygetopt.h
Include/pythonrun.h
Modules/main.c
Python/getopt.c
Python/pythonrun.c

index 80908bea982d371838825aa2ef185326887f60e7..9860d360e1e68392764edbf8c69e4915ac855e37 100644 (file)
@@ -9,6 +9,7 @@ PyAPI_DATA(int) _PyOS_opterr;
 PyAPI_DATA(int) _PyOS_optind;
 PyAPI_DATA(char *) _PyOS_optarg;
 
+PyAPI_FUNC(void) _PyOS_ResetGetOpt(void);
 PyAPI_FUNC(int) _PyOS_GetOpt(int argc, char **argv, char *optstring);
 
 #ifdef __cplusplus
index 74024c10689e8410f824794815745ecfb05b8bd2..97d9b77cd2453b5c53e5f95936943e621899fe1d 100644 (file)
@@ -125,6 +125,7 @@ PyAPI_FUNC(int) _PyFrame_Init(void);
 PyAPI_FUNC(int) _PyInt_Init(void);
 PyAPI_FUNC(void) _PyFloat_Init(void);
 PyAPI_FUNC(int) PyByteArray_Init(void);
+PyAPI_FUNC(void) _PyRandom_Init(void);
 
 /* Various internal finalizers */
 PyAPI_FUNC(void) _PyExc_Fini(void);
index 780d877b518c57ea81986cc88558bc00b6e688d1..929991a8c55f89c5f414d05af387d5ad10f194f4 100644 (file)
@@ -261,7 +261,33 @@ Py_Main(int argc, char **argv)
     Py_RISCOSWimpFlag = 0;
 #endif
 
+    /* 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') {
@@ -355,7 +381,7 @@ Py_Main(int argc, char **argv)
             break;
 
         case 'E':
-            Py_IgnoreEnvironmentFlag++;
+            /* Already handled above */
             break;
 
         case 't':
@@ -405,7 +431,7 @@ Py_Main(int argc, char **argv)
             break;
 
         case 'R':
-            Py_HashRandomizationFlag++;
+            /* Already handled above */
             break;
 
         /* This space reserved for other options */
index 093c3dada294fdf6c5caa0ba3dcd89d50bfbbabe..e96eb6ccc3d3706d595bada747e2574dccbaba1c 100644 (file)
@@ -37,10 +37,18 @@ extern "C" {
 int _PyOS_opterr = 1;          /* generate error messages */
 int _PyOS_optind = 1;          /* index into argv array   */
 char *_PyOS_optarg = NULL;     /* optional argument       */
+static char *opt_ptr = "";
+
+void _PyOS_ResetGetOpt(void)
+{
+    _PyOS_opterr = 1;
+    _PyOS_optind = 1;
+    _PyOS_optarg = NULL;
+    opt_ptr = "";
+}
 
 int _PyOS_GetOpt(int argc, char **argv, char *optstring)
 {
-    static char *opt_ptr = "";
     char *ptr;
     int option;
 
index a2663c70671d3922d5098e748484ea2a86851402..2f8318bc5fe0f4e42eb13f736d0287daf989e4a4 100644 (file)
@@ -67,7 +67,6 @@ static void call_sys_exitfunc(void);
 static void call_ll_exitfuncs(void);
 extern void _PyUnicode_Init(void);
 extern void _PyUnicode_Fini(void);
-extern void _PyRandom_Init(void);
 
 #ifdef WITH_THREAD
 extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *);