@@ -399,6 +399,7 @@ typedef struct {
399399 _PyInitError err ;
400400 /* PYTHONWARNINGS env var */
401401 _Py_OptList env_warning_options ;
402+ /* PYTHONPATH env var */
402403 int argc ;
403404 wchar_t * * argv ;
404405} _PyMain ;
@@ -441,6 +442,8 @@ pymain_free_impl(_PyMain *pymain)
441442 Py_CLEAR (pymain -> main_importer_path );
442443 PyMem_RawFree (pymain -> program_name );
443444
445+ PyMem_RawFree (pymain -> core_config .module_search_path_env );
446+
444447#ifdef __INSURE__
445448 /* Insure++ is a memory analysis tool that aids in discovering
446449 * memory leaks and other memory problems. On Python exit, the
@@ -502,23 +505,30 @@ pymain_run_main_from_importer(_PyMain *pymain)
502505
503506
504507static wchar_t *
505- pymain_strdup (_PyMain * pymain , wchar_t * str )
508+ pymain_wstrdup (_PyMain * pymain , wchar_t * str )
506509{
507510 size_t len = wcslen (str ) + 1 ; /* +1 for NUL character */
508- wchar_t * str2 = PyMem_RawMalloc (sizeof (wchar_t ) * len );
511+ if (len > (size_t )PY_SSIZE_T_MAX / sizeof (wchar_t )) {
512+ pymain -> err = INIT_NO_MEMORY ();
513+ return NULL ;
514+ }
515+
516+ size_t size = len * sizeof (wchar_t );
517+ wchar_t * str2 = PyMem_RawMalloc (size );
509518 if (str2 == NULL ) {
510519 pymain -> err = INIT_NO_MEMORY ();
511520 return NULL ;
512521 }
513- memcpy (str2 , str , len * sizeof (wchar_t ));
522+
523+ memcpy (str2 , str , size );
514524 return str2 ;
515525}
516526
517527
518528static int
519529pymain_optlist_append (_PyMain * pymain , _Py_OptList * list , wchar_t * str )
520530{
521- wchar_t * str2 = pymain_strdup (pymain , str );
531+ wchar_t * str2 = pymain_wstrdup (pymain , str );
522532 if (str2 == NULL ) {
523533 return -1 ;
524534 }
@@ -762,14 +772,12 @@ pymain_warnings_envvar(_PyMain *pymain)
762772 wchar_t * wp ;
763773
764774 if ((wp = _wgetenv (L"PYTHONWARNINGS" )) && * wp != L'\0' ) {
765- wchar_t * buf , * warning , * context = NULL ;
775+ wchar_t * warning , * context = NULL ;
766776
767- buf = ( wchar_t * ) PyMem_RawMalloc (( wcslen ( wp ) + 1 ) * sizeof ( wchar_t ) );
777+ wchar_t * buf = pymain_wstrdup ( pymain , wp );
768778 if (buf == NULL ) {
769- pymain -> err = INIT_NO_MEMORY ();
770779 return -1 ;
771780 }
772- wcscpy (buf , wp );
773781 for (warning = wcstok_s (buf , L"," , & context );
774782 warning != NULL ;
775783 warning = wcstok_s (NULL , L"," , & context )) {
@@ -805,12 +813,11 @@ pymain_warnings_envvar(_PyMain *pymain)
805813 if (len == (size_t )-2 ) {
806814 pymain -> err = _Py_INIT_ERR ("failed to decode "
807815 "PYTHONWARNINGS" );
808- return -1 ;
809816 }
810817 else {
811818 pymain -> err = INIT_NO_MEMORY ();
812- return -1 ;
813819 }
820+ return -1 ;
814821 }
815822 if (pymain_optlist_append (pymain , & pymain -> env_warning_options ,
816823 warning ) < 0 ) {
@@ -929,7 +936,7 @@ pymain_get_program_name(_PyMain *pymain)
929936
930937 if (pymain -> program_name == NULL ) {
931938 /* Use argv[0] by default */
932- pymain -> program_name = pymain_strdup (pymain , pymain -> argv [0 ]);
939+ pymain -> program_name = pymain_wstrdup (pymain , pymain -> argv [0 ]);
933940 if (pymain -> program_name == NULL ) {
934941 return -1 ;
935942 }
@@ -1362,6 +1369,48 @@ pymain_set_flags_from_env(_PyMain *pymain)
13621369}
13631370
13641371
1372+ static int
1373+ pymain_init_pythonpath (_PyMain * pymain )
1374+ {
1375+ if (Py_IgnoreEnvironmentFlag ) {
1376+ return 0 ;
1377+ }
1378+
1379+ #ifdef MS_WINDOWS
1380+ wchar_t * path = _wgetenv (L"PYTHONPATH" );
1381+ if (!path || path [0 ] == '\0' ) {
1382+ return 0 ;
1383+ }
1384+
1385+ wchar_t * path2 = pymain_wstrdup (pymain , path );
1386+ if (path2 == NULL ) {
1387+ return -1 ;
1388+ }
1389+
1390+ pymain -> core_config .module_search_path_env = path2 ;
1391+ #else
1392+ char * path = pymain_get_env_var ("PYTHONPATH" );
1393+ if (!path ) {
1394+ return 0 ;
1395+ }
1396+
1397+ size_t len ;
1398+ wchar_t * wpath = Py_DecodeLocale (path , & len );
1399+ if (!wpath ) {
1400+ if (len == (size_t )-2 ) {
1401+ pymain -> err = _Py_INIT_ERR ("failed to decode PYTHONHOME" );
1402+ }
1403+ else {
1404+ pymain -> err = INIT_NO_MEMORY ();
1405+ }
1406+ return -1 ;
1407+ }
1408+ pymain -> core_config .module_search_path_env = wpath ;
1409+ #endif
1410+ return 0 ;
1411+ }
1412+
1413+
13651414static int
13661415pymain_parse_envvars (_PyMain * pymain )
13671416{
@@ -1383,6 +1432,9 @@ pymain_parse_envvars(_PyMain *pymain)
13831432 return -1 ;
13841433 }
13851434 core_config -> allocator = Py_GETENV ("PYTHONMALLOC" );
1435+ if (pymain_init_pythonpath (pymain ) < 0 ) {
1436+ return -1 ;
1437+ }
13861438
13871439 /* -X options */
13881440 if (pymain_get_xoption (pymain , L"showrefcount" )) {
0 commit comments