diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2012-02-21 19:42:48 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2012-02-21 19:42:48 (GMT) |
commit | 776af4002bb6edf6071f0b82f0354ed7b218695e (patch) | |
tree | db9510e763e2476783eb331b9a6fb396995bc815 | |
parent | 876e789f650a68b1fe05be7060794357cf13e3d3 (diff) | |
download | cpython-776af4002bb6edf6071f0b82f0354ed7b218695e.zip cpython-776af4002bb6edf6071f0b82f0354ed7b218695e.tar.gz cpython-776af4002bb6edf6071f0b82f0354ed7b218695e.tar.bz2 |
Fix crash at startup with -W options.
-rw-r--r-- | Include/pygetopt.h | 1 | ||||
-rw-r--r-- | Include/pythonrun.h | 1 | ||||
-rw-r--r-- | Modules/main.c | 30 | ||||
-rw-r--r-- | Python/getopt.c | 10 | ||||
-rw-r--r-- | Python/pythonrun.c | 1 |
5 files changed, 39 insertions, 4 deletions
diff --git a/Include/pygetopt.h b/Include/pygetopt.h index 80908be..9860d36 100644 --- a/Include/pygetopt.h +++ b/Include/pygetopt.h @@ -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 diff --git a/Include/pythonrun.h b/Include/pythonrun.h index 74024c1..97d9b77 100644 --- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -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); diff --git a/Modules/main.c b/Modules/main.c index 780d877..929991a 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -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 */ diff --git a/Python/getopt.c b/Python/getopt.c index 093c3da..e96eb6c 100644 --- a/Python/getopt.c +++ b/Python/getopt.c @@ -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; diff --git a/Python/pythonrun.c b/Python/pythonrun.c index a2663c7..2f8318b 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -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 *); |