@@ -339,7 +339,33 @@ Py_Main(int argc, wchar_t **argv)
339339 orig_argc = argc ; /* For Py_GetArgcArgv() */
340340 orig_argv = argv ;
341341
342+ /* Hash randomization needed early for all string operations
343+ (including -W and -X options). */
344+ while ((c = _PyOS_GetOpt (argc , argv , PROGRAM_OPTS )) != EOF ) {
345+ if (c == 'm' || c == 'c' ) {
346+ /* -c / -m is the last option: following arguments are
347+ not interpreter options. */
348+ break ;
349+ }
350+ switch (c ) {
351+ case 'E' :
352+ Py_IgnoreEnvironmentFlag ++ ;
353+ break ;
354+ case 'R' :
355+ Py_HashRandomizationFlag ++ ;
356+ break ;
357+ }
358+ }
359+ /* The variable is only tested for existence here; _PyRandom_Init will
360+ check its value further. */
361+ if (!Py_HashRandomizationFlag &&
362+ (p = Py_GETENV ("PYTHONHASHSEED" )) && * p != '\0' )
363+ Py_HashRandomizationFlag = 1 ;
364+
365+ _PyRandom_Init ();
366+
342367 PySys_ResetWarnOptions ();
368+ _PyOS_ResetGetOpt ();
343369
344370 while ((c = _PyOS_GetOpt (argc , argv , PROGRAM_OPTS )) != EOF ) {
345371 if (c == 'c' ) {
@@ -400,7 +426,7 @@ Py_Main(int argc, wchar_t **argv)
400426 break ;
401427
402428 case 'E' :
403- Py_IgnoreEnvironmentFlag ++ ;
429+ /* Already handled above */
404430 break ;
405431
406432 case 't' :
@@ -442,7 +468,7 @@ Py_Main(int argc, wchar_t **argv)
442468 break ;
443469
444470 case 'R' :
445- Py_HashRandomizationFlag ++ ;
471+ /* Already handled above */
446472 break ;
447473
448474 /* This space reserved for other options */
0 commit comments