From 86838b02f04a01445778584afb7acd0b05081335 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Tue, 21 Feb 2012 19:03:47 +0100 Subject: [PATCH] Fix test failure in test_cmd_line by initializing the hash secret at the earliest point. --- Include/pygetopt.h | 2 ++ Include/pythonrun.h | 1 + Modules/main.c | 30 ++++++++++++++++++++++++++++-- Python/getopt.c | 11 ++++++++++- Python/pythonrun.c | 1 - 5 files changed, 41 insertions(+), 4 deletions(-) diff --git a/Include/pygetopt.h b/Include/pygetopt.h index 4de8c0045d9..425c7dd6546 100644 --- a/Include/pygetopt.h +++ b/Include/pygetopt.h @@ -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); diff --git a/Include/pythonrun.h b/Include/pythonrun.h index 50549325968..e244ce713b0 100644 --- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -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 */ diff --git a/Modules/main.c b/Modules/main.c index ed84aa02860..6b2d0f5fa84 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -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 */ diff --git a/Python/getopt.c b/Python/getopt.c index 064a1874ea5..cc424312fe9 100644 --- a/Python/getopt.c +++ b/Python/getopt.c @@ -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; diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 718362d4792..584a19b426b 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -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 *);