Fix crash at startup with -W options.

This commit is contained in:
Antoine Pitrou 2012-02-21 20:42:48 +01:00
parent 876e789f65
commit 776af4002b
5 changed files with 39 additions and 4 deletions

View 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

View 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);

View 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 */

View 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;

View 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 *);