[Python-checkins] cpython (2.7): Fix crash at startup with -W options.

antoine.pitrou python-checkins at python.org
Tue Feb 21 20:46:14 CET 2012


http://hg.python.org/cpython/rev/0abffbe7cf22
changeset: 75147:0abffbe7cf22
branch: 2.7
parent: 75140:e78acdb54841
user: Antoine Pitrou <solipsis at pitrou.net>
date: Tue Feb 21 20:42:48 2012 +0100
summary:
 Fix crash at startup with -W options.
files:
 Include/pygetopt.h | 1 +
 Include/pythonrun.h | 1 +
 Modules/main.c | 30 ++++++++++++++++++++++++++++--
 Python/getopt.c | 10 +++++++++-
 Python/pythonrun.c | 1 -
 5 files changed, 39 insertions(+), 4 deletions(-)
diff --git a/Include/pygetopt.h b/Include/pygetopt.h
--- a/Include/pygetopt.h
+++ b/Include/pygetopt.h
@@ -9,6 +9,7 @@
 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
--- a/Include/pythonrun.h
+++ b/Include/pythonrun.h
@@ -128,6 +128,7 @@
 PyAPI_FUNC(int) _PyLong_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
--- a/Modules/main.c
+++ b/Modules/main.c
@@ -262,7 +262,33 @@
 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') {
@@ -356,7 +382,7 @@
 break;
 
 case 'E':
- Py_IgnoreEnvironmentFlag++;
+ /* Already handled above */
 break;
 
 case 't':
@@ -406,7 +432,7 @@
 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
--- a/Python/getopt.c
+++ b/Python/getopt.c
@@ -37,10 +37,18 @@
 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
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -67,7 +67,6 @@
 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 *);
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /