@@ -337,7 +337,33 @@ Py_Main(int argc, wchar_t **argv)
337337 orig_argc = argc ; /* For Py_GetArgcArgv() */
338338 orig_argv = argv ;
339339
340+ /* Hash randomization needed early for all string operations
341+ (including -W and -X options). */
342+ while ((c = _PyOS_GetOpt (argc , argv , PROGRAM_OPTS )) != EOF ) {
343+ if (c == 'm' || c == 'c' ) {
344+ /* -c / -m is the last option: following arguments are
345+ not interpreter options. */
346+ break ;
347+ }
348+ switch (c ) {
349+ case 'E' :
350+ Py_IgnoreEnvironmentFlag ++ ;
351+ break ;
352+ case 'R' :
353+ Py_HashRandomizationFlag ++ ;
354+ break ;
355+ }
356+ }
357+ /* The variable is only tested for existence here; _PyRandom_Init will
358+ check its value further. */
359+ if (!Py_HashRandomizationFlag &&
360+ (p = Py_GETENV ("PYTHONHASHSEED" )) && * p != '\0' )
361+ Py_HashRandomizationFlag = 1 ;
362+
363+ _PyRandom_Init ();
364+
340365 PySys_ResetWarnOptions ();
366+ _PyOS_ResetGetOpt ();
341367
342368 while ((c = _PyOS_GetOpt (argc , argv , PROGRAM_OPTS )) != EOF ) {
343369 if (c == 'c' ) {
@@ -398,7 +424,7 @@ Py_Main(int argc, wchar_t **argv)
398424 break ;
399425
400426 case 'E' :
401- Py_IgnoreEnvironmentFlag ++ ;
427+ /* Already handled above */
402428 break ;
403429
404430 case 't' :
@@ -440,7 +466,7 @@ Py_Main(int argc, wchar_t **argv)
440466 break ;
441467
442468 case 'R' :
443- Py_HashRandomizationFlag ++ ;
469+ /* Already handled above */
444470 break ;
445471
446472 /* This space reserved for other options */
0 commit comments