1 /* Python interpreter top-level routines, including init/exit */
2 
3 #include "Python.h"
4 
5 #include "pycore_bytesobject.h"   // _PyBytes_InitTypes()
6 #include "pycore_ceval.h"         // _PyEval_FiniGIL()
7 #include "pycore_context.h"       // _PyContext_Init()
8 #include "pycore_exceptions.h"    // _PyExc_InitTypes()
9 #include "pycore_dict.h"          // _PyDict_Fini()
10 #include "pycore_fileutils.h"     // _Py_ResetForceASCII()
11 #include "pycore_floatobject.h"   // _PyFloat_InitTypes()
12 #include "pycore_genobject.h"     // _PyAsyncGen_Fini()
13 #include "pycore_import.h"        // _PyImport_BootstrapImp()
14 #include "pycore_initconfig.h"    // _PyStatus_OK()
15 #include "pycore_list.h"          // _PyList_Fini()
16 #include "pycore_long.h"          // _PyLong_InitTypes()
17 #include "pycore_object.h"        // _PyDebug_PrintTotalRefs()
18 #include "pycore_pathconfig.h"    // _PyConfig_WritePathConfig()
19 #include "pycore_pyerrors.h"      // _PyErr_Occurred()
20 #include "pycore_pylifecycle.h"   // _PyErr_Print()
21 #include "pycore_pymem.h"         // _PyObject_DebugMallocStats()
22 #include "pycore_pystate.h"       // _PyThreadState_GET()
23 #include "pycore_runtime.h"       // _Py_ID()
24 #include "pycore_runtime_init.h"  // _PyRuntimeState_INIT
25 #include "pycore_sliceobject.h"   // _PySlice_Fini()
26 #include "pycore_sysmodule.h"     // _PySys_ClearAuditHooks()
27 #include "pycore_traceback.h"     // _Py_DumpTracebackThreads()
28 #include "pycore_tuple.h"         // _PyTuple_InitTypes()
29 #include "pycore_typeobject.h"    // _PyTypes_InitTypes()
30 #include "pycore_unicodeobject.h" // _PyUnicode_InitTypes()
31 
32 extern void _PyIO_Fini(void);
33 
34 #include <locale.h>               // setlocale()
35 #include <stdlib.h>               // getenv()
36 
37 #if defined(__APPLE__)
38 #include <mach-o/loader.h>
39 #endif
40 
41 #ifdef HAVE_SIGNAL_H
42 #  include <signal.h>             // SIG_IGN
43 #endif
44 
45 #ifdef HAVE_LANGINFO_H
46 #  include <langinfo.h>           // nl_langinfo(CODESET)
47 #endif
48 
49 #ifdef HAVE_FCNTL_H
50 #  include <fcntl.h>              // F_GETFD
51 #endif
52 
53 #ifdef MS_WINDOWS
54 #  undef BYTE
55 #  include "windows.h"
56 
57    extern PyTypeObject PyWindowsConsoleIO_Type;
58 #  define PyWindowsConsoleIO_Check(op) \
59        (PyObject_TypeCheck((op), &PyWindowsConsoleIO_Type))
60 #endif
61 
62 #define PUTS(fd, str) _Py_write_noraise(fd, str, (int)strlen(str))
63 
64 
65 #ifdef __cplusplus
66 extern "C" {
67 #endif
68 
69 
70 /* Forward declarations */
71 static PyStatus add_main_module(PyInterpreterState *interp);
72 static PyStatus init_import_site(void);
73 static PyStatus init_set_builtins_open(void);
74 static PyStatus init_sys_streams(PyThreadState *tstate);
75 static void wait_for_thread_shutdown(PyThreadState *tstate);
76 static void call_ll_exitfuncs(_PyRuntimeState *runtime);
77 
78 int _Py_UnhandledKeyboardInterrupt = 0;
79 
80 /* The following places the `_PyRuntime` structure in a location that can be
81  * found without any external information. This is meant to ease access to the
82  * interpreter state for various runtime debugging tools, but is *not* an
83  * officially supported feature */
84 
85 /* Suppress deprecation warning for PyBytesObject.ob_shash */
86 _Py_COMP_DIAG_PUSH
87 _Py_COMP_DIAG_IGNORE_DEPR_DECLS
88 
89 #if defined(MS_WINDOWS)
90 
91 #pragma section("PyRuntime", read, write)
92 __declspec(allocate("PyRuntime"))
93 
94 #elif defined(__APPLE__)
95 
96 __attribute__((
97     section(SEG_DATA ",PyRuntime")
98 ))
99 
100 #endif
101 
102 _PyRuntimeState _PyRuntime
103 #if defined(__linux__) && (defined(__GNUC__) || defined(__clang__))
104 __attribute__ ((section (".PyRuntime")))
105 #endif
106 = _PyRuntimeState_INIT;
107 _Py_COMP_DIAG_POP
108 
109 static int runtime_initialized = 0;
110 
111 PyStatus
_PyRuntime_Initialize(void)112 _PyRuntime_Initialize(void)
113 {
114     /* XXX We only initialize once in the process, which aligns with
115        the static initialization of the former globals now found in
116        _PyRuntime.  However, _PyRuntime *should* be initialized with
117        every Py_Initialize() call, but doing so breaks the runtime.
118        This is because the runtime state is not properly finalized
119        currently. */
120     if (runtime_initialized) {
121         return _PyStatus_OK();
122     }
123     runtime_initialized = 1;
124 
125     return _PyRuntimeState_Init(&_PyRuntime);
126 }
127 
128 void
_PyRuntime_Finalize(void)129 _PyRuntime_Finalize(void)
130 {
131     _PyRuntimeState_Fini(&_PyRuntime);
132     runtime_initialized = 0;
133 }
134 
135 int
_Py_IsFinalizing(void)136 _Py_IsFinalizing(void)
137 {
138     return _PyRuntimeState_GetFinalizing(&_PyRuntime) != NULL;
139 }
140 
141 /* Hack to force loading of object files */
142 int (*_PyOS_mystrnicmp_hack)(const char *, const char *, Py_ssize_t) = \
143     PyOS_mystrnicmp; /* Python/pystrcmp.o */
144 
145 
146 /* APIs to access the initialization flags
147  *
148  * Can be called prior to Py_Initialize.
149  */
150 
151 int
_Py_IsCoreInitialized(void)152 _Py_IsCoreInitialized(void)
153 {
154     return _PyRuntime.core_initialized;
155 }
156 
157 int
Py_IsInitialized(void)158 Py_IsInitialized(void)
159 {
160     return _PyRuntime.initialized;
161 }
162 
163 
164 /* Global initializations.  Can be undone by Py_FinalizeEx().  Don't
165    call this twice without an intervening Py_FinalizeEx() call.  When
166    initializations fail, a fatal error is issued and the function does
167    not return.  On return, the first thread and interpreter state have
168    been created.
169 
170    Locking: you must hold the interpreter lock while calling this.
171    (If the lock has not yet been initialized, that's equivalent to
172    having the lock, but you cannot use multiple threads.)
173 
174 */
175 static int
init_importlib(PyThreadState * tstate,PyObject * sysmod)176 init_importlib(PyThreadState *tstate, PyObject *sysmod)
177 {
178     assert(!_PyErr_Occurred(tstate));
179 
180     PyInterpreterState *interp = tstate->interp;
181     int verbose = _PyInterpreterState_GetConfig(interp)->verbose;
182 
183     // Import _importlib through its frozen version, _frozen_importlib.
184     if (verbose) {
185         PySys_FormatStderr("import _frozen_importlib # frozen\n");
186     }
187     if (PyImport_ImportFrozenModule("_frozen_importlib") <= 0) {
188         return -1;
189     }
190     PyObject *importlib = PyImport_AddModule("_frozen_importlib"); // borrowed
191     if (importlib == NULL) {
192         return -1;
193     }
194     interp->importlib = Py_NewRef(importlib);
195 
196     // Import the _imp module
197     if (verbose) {
198         PySys_FormatStderr("import _imp # builtin\n");
199     }
200     PyObject *imp_mod = _PyImport_BootstrapImp(tstate);
201     if (imp_mod == NULL) {
202         return -1;
203     }
204     if (_PyImport_SetModuleString("_imp", imp_mod) < 0) {
205         Py_DECREF(imp_mod);
206         return -1;
207     }
208 
209     // Install importlib as the implementation of import
210     PyObject *value = PyObject_CallMethod(importlib, "_install",
211                                           "OO", sysmod, imp_mod);
212     Py_DECREF(imp_mod);
213     if (value == NULL) {
214         return -1;
215     }
216     Py_DECREF(value);
217 
218     assert(!_PyErr_Occurred(tstate));
219     return 0;
220 }
221 
222 
223 static PyStatus
init_importlib_external(PyThreadState * tstate)224 init_importlib_external(PyThreadState *tstate)
225 {
226     PyObject *value;
227     value = PyObject_CallMethod(tstate->interp->importlib,
228                                 "_install_external_importers", "");
229     if (value == NULL) {
230         _PyErr_Print(tstate);
231         return _PyStatus_ERR("external importer setup failed");
232     }
233     Py_DECREF(value);
234     return _PyImportZip_Init(tstate);
235 }
236 
237 /* Helper functions to better handle the legacy C locale
238  *
239  * The legacy C locale assumes ASCII as the default text encoding, which
240  * causes problems not only for the CPython runtime, but also other
241  * components like GNU readline.
242  *
243  * Accordingly, when the CLI detects it, it attempts to coerce it to a
244  * more capable UTF-8 based alternative as follows:
245  *
246  *     if (_Py_LegacyLocaleDetected()) {
247  *         _Py_CoerceLegacyLocale();
248  *     }
249  *
250  * See the documentation of the PYTHONCOERCECLOCALE setting for more details.
251  *
252  * Locale coercion also impacts the default error handler for the standard
253  * streams: while the usual default is "strict", the default for the legacy
254  * C locale and for any of the coercion target locales is "surrogateescape".
255  */
256 
257 int
_Py_LegacyLocaleDetected(int warn)258 _Py_LegacyLocaleDetected(int warn)
259 {
260 #ifndef MS_WINDOWS
261     if (!warn) {
262         const char *locale_override = getenv("LC_ALL");
263         if (locale_override != NULL && *locale_override != '\0') {
264             /* Don't coerce C locale if the LC_ALL environment variable
265                is set */
266             return 0;
267         }
268     }
269 
270     /* On non-Windows systems, the C locale is considered a legacy locale */
271     /* XXX (ncoghlan): some platforms (notably Mac OS X) don't appear to treat
272      *                 the POSIX locale as a simple alias for the C locale, so
273      *                 we may also want to check for that explicitly.
274      */
275     const char *ctype_loc = setlocale(LC_CTYPE, NULL);
276     return ctype_loc != NULL && strcmp(ctype_loc, "C") == 0;
277 #else
278     /* Windows uses code pages instead of locales, so no locale is legacy */
279     return 0;
280 #endif
281 }
282 
283 #ifndef MS_WINDOWS
284 static const char *_C_LOCALE_WARNING =
285     "Python runtime initialized with LC_CTYPE=C (a locale with default ASCII "
286     "encoding), which may cause Unicode compatibility problems. Using C.UTF-8, "
287     "C.utf8, or UTF-8 (if available) as alternative Unicode-compatible "
288     "locales is recommended.\n";
289 
290 static void
emit_stderr_warning_for_legacy_locale(_PyRuntimeState * runtime)291 emit_stderr_warning_for_legacy_locale(_PyRuntimeState *runtime)
292 {
293     const PyPreConfig *preconfig = &runtime->preconfig;
294     if (preconfig->coerce_c_locale_warn && _Py_LegacyLocaleDetected(1)) {
295         PySys_FormatStderr("%s", _C_LOCALE_WARNING);
296     }
297 }
298 #endif   /* !defined(MS_WINDOWS) */
299 
300 typedef struct _CandidateLocale {
301     const char *locale_name; /* The locale to try as a coercion target */
302 } _LocaleCoercionTarget;
303 
304 static _LocaleCoercionTarget _TARGET_LOCALES[] = {
305     {"C.UTF-8"},
306     {"C.utf8"},
307     {"UTF-8"},
308     {NULL}
309 };
310 
311 
312 int
_Py_IsLocaleCoercionTarget(const char * ctype_loc)313 _Py_IsLocaleCoercionTarget(const char *ctype_loc)
314 {
315     const _LocaleCoercionTarget *target = NULL;
316     for (target = _TARGET_LOCALES; target->locale_name; target++) {
317         if (strcmp(ctype_loc, target->locale_name) == 0) {
318             return 1;
319         }
320     }
321     return 0;
322 }
323 
324 
325 #ifdef PY_COERCE_C_LOCALE
326 static const char C_LOCALE_COERCION_WARNING[] =
327     "Python detected LC_CTYPE=C: LC_CTYPE coerced to %.20s (set another locale "
328     "or PYTHONCOERCECLOCALE=0 to disable this locale coercion behavior).\n";
329 
330 static int
_coerce_default_locale_settings(int warn,const _LocaleCoercionTarget * target)331 _coerce_default_locale_settings(int warn, const _LocaleCoercionTarget *target)
332 {
333     const char *newloc = target->locale_name;
334 
335     /* Reset locale back to currently configured defaults */
336     _Py_SetLocaleFromEnv(LC_ALL);
337 
338     /* Set the relevant locale environment variable */
339     if (setenv("LC_CTYPE", newloc, 1)) {
340         fprintf(stderr,
341                 "Error setting LC_CTYPE, skipping C locale coercion\n");
342         return 0;
343     }
344     if (warn) {
345         fprintf(stderr, C_LOCALE_COERCION_WARNING, newloc);
346     }
347 
348     /* Reconfigure with the overridden environment variables */
349     _Py_SetLocaleFromEnv(LC_ALL);
350     return 1;
351 }
352 #endif
353 
354 int
_Py_CoerceLegacyLocale(int warn)355 _Py_CoerceLegacyLocale(int warn)
356 {
357     int coerced = 0;
358 #ifdef PY_COERCE_C_LOCALE
359     char *oldloc = NULL;
360 
361     oldloc = _PyMem_RawStrdup(setlocale(LC_CTYPE, NULL));
362     if (oldloc == NULL) {
363         return coerced;
364     }
365 
366     const char *locale_override = getenv("LC_ALL");
367     if (locale_override == NULL || *locale_override == '\0') {
368         /* LC_ALL is also not set (or is set to an empty string) */
369         const _LocaleCoercionTarget *target = NULL;
370         for (target = _TARGET_LOCALES; target->locale_name; target++) {
371             const char *new_locale = setlocale(LC_CTYPE,
372                                                target->locale_name);
373             if (new_locale != NULL) {
374 #if !defined(_Py_FORCE_UTF8_LOCALE) && defined(HAVE_LANGINFO_H) && defined(CODESET)
375                 /* Also ensure that nl_langinfo works in this locale */
376                 char *codeset = nl_langinfo(CODESET);
377                 if (!codeset || *codeset == '\0') {
378                     /* CODESET is not set or empty, so skip coercion */
379                     new_locale = NULL;
380                     _Py_SetLocaleFromEnv(LC_CTYPE);
381                     continue;
382                 }
383 #endif
384                 /* Successfully configured locale, so make it the default */
385                 coerced = _coerce_default_locale_settings(warn, target);
386                 goto done;
387             }
388         }
389     }
390     /* No C locale warning here, as Py_Initialize will emit one later */
391 
392     setlocale(LC_CTYPE, oldloc);
393 
394 done:
395     PyMem_RawFree(oldloc);
396 #endif
397     return coerced;
398 }
399 
400 /* _Py_SetLocaleFromEnv() is a wrapper around setlocale(category, "") to
401  * isolate the idiosyncrasies of different libc implementations. It reads the
402  * appropriate environment variable and uses its value to select the locale for
403  * 'category'. */
404 char *
_Py_SetLocaleFromEnv(int category)405 _Py_SetLocaleFromEnv(int category)
406 {
407     char *res;
408 #ifdef __ANDROID__
409     const char *locale;
410     const char **pvar;
411 #ifdef PY_COERCE_C_LOCALE
412     const char *coerce_c_locale;
413 #endif
414     const char *utf8_locale = "C.UTF-8";
415     const char *env_var_set[] = {
416         "LC_ALL",
417         "LC_CTYPE",
418         "LANG",
419         NULL,
420     };
421 
422     /* Android setlocale(category, "") doesn't check the environment variables
423      * and incorrectly sets the "C" locale at API 24 and older APIs. We only
424      * check the environment variables listed in env_var_set. */
425     for (pvar=env_var_set; *pvar; pvar++) {
426         locale = getenv(*pvar);
427         if (locale != NULL && *locale != '\0') {
428             if (strcmp(locale, utf8_locale) == 0 ||
429                     strcmp(locale, "en_US.UTF-8") == 0) {
430                 return setlocale(category, utf8_locale);
431             }
432             return setlocale(category, "C");
433         }
434     }
435 
436     /* Android uses UTF-8, so explicitly set the locale to C.UTF-8 if none of
437      * LC_ALL, LC_CTYPE, or LANG is set to a non-empty string.
438      * Quote from POSIX section "8.2 Internationalization Variables":
439      * "4. If the LANG environment variable is not set or is set to the empty
440      * string, the implementation-defined default locale shall be used." */
441 
442 #ifdef PY_COERCE_C_LOCALE
443     coerce_c_locale = getenv("PYTHONCOERCECLOCALE");
444     if (coerce_c_locale == NULL || strcmp(coerce_c_locale, "0") != 0) {
445         /* Some other ported code may check the environment variables (e.g. in
446          * extension modules), so we make sure that they match the locale
447          * configuration */
448         if (setenv("LC_CTYPE", utf8_locale, 1)) {
449             fprintf(stderr, "Warning: failed setting the LC_CTYPE "
450                             "environment variable to %s\n", utf8_locale);
451         }
452     }
453 #endif
454     res = setlocale(category, utf8_locale);
455 #else /* !defined(__ANDROID__) */
456     res = setlocale(category, "");
457 #endif
458     _Py_ResetForceASCII();
459     return res;
460 }
461 
462 
463 static int
interpreter_update_config(PyThreadState * tstate,int only_update_path_config)464 interpreter_update_config(PyThreadState *tstate, int only_update_path_config)
465 {
466     const PyConfig *config = &tstate->interp->config;
467 
468     if (!only_update_path_config) {
469         PyStatus status = _PyConfig_Write(config, tstate->interp->runtime);
470         if (_PyStatus_EXCEPTION(status)) {
471             _PyErr_SetFromPyStatus(status);
472             return -1;
473         }
474     }
475 
476     if (_Py_IsMainInterpreter(tstate->interp)) {
477         PyStatus status = _PyPathConfig_UpdateGlobal(config);
478         if (_PyStatus_EXCEPTION(status)) {
479             _PyErr_SetFromPyStatus(status);
480             return -1;
481         }
482     }
483 
484     // Update the sys module for the new configuration
485     if (_PySys_UpdateConfig(tstate) < 0) {
486         return -1;
487     }
488     return 0;
489 }
490 
491 
492 int
_PyInterpreterState_SetConfig(const PyConfig * src_config)493 _PyInterpreterState_SetConfig(const PyConfig *src_config)
494 {
495     PyThreadState *tstate = _PyThreadState_GET();
496     int res = -1;
497 
498     PyConfig config;
499     PyConfig_InitPythonConfig(&config);
500     PyStatus status = _PyConfig_Copy(&config, src_config);
501     if (_PyStatus_EXCEPTION(status)) {
502         _PyErr_SetFromPyStatus(status);
503         goto done;
504     }
505 
506     status = _PyConfig_Read(&config, 1);
507     if (_PyStatus_EXCEPTION(status)) {
508         _PyErr_SetFromPyStatus(status);
509         goto done;
510     }
511 
512     status = _PyConfig_Copy(&tstate->interp->config, &config);
513     if (_PyStatus_EXCEPTION(status)) {
514         _PyErr_SetFromPyStatus(status);
515         goto done;
516     }
517 
518     res = interpreter_update_config(tstate, 0);
519 
520 done:
521     PyConfig_Clear(&config);
522     return res;
523 }
524 
525 
526 /* Global initializations.  Can be undone by Py_Finalize().  Don't
527    call this twice without an intervening Py_Finalize() call.
528 
529    Every call to Py_InitializeFromConfig, Py_Initialize or Py_InitializeEx
530    must have a corresponding call to Py_Finalize.
531 
532    Locking: you must hold the interpreter lock while calling these APIs.
533    (If the lock has not yet been initialized, that's equivalent to
534    having the lock, but you cannot use multiple threads.)
535 
536 */
537 
538 static PyStatus
pyinit_core_reconfigure(_PyRuntimeState * runtime,PyThreadState ** tstate_p,const PyConfig * config)539 pyinit_core_reconfigure(_PyRuntimeState *runtime,
540                         PyThreadState **tstate_p,
541                         const PyConfig *config)
542 {
543     PyStatus status;
544     PyThreadState *tstate = _PyThreadState_GET();
545     if (!tstate) {
546         return _PyStatus_ERR("failed to read thread state");
547     }
548     *tstate_p = tstate;
549 
550     PyInterpreterState *interp = tstate->interp;
551     if (interp == NULL) {
552         return _PyStatus_ERR("can't make main interpreter");
553     }
554 
555     status = _PyConfig_Write(config, runtime);
556     if (_PyStatus_EXCEPTION(status)) {
557         return status;
558     }
559 
560     status = _PyConfig_Copy(&interp->config, config);
561     if (_PyStatus_EXCEPTION(status)) {
562         return status;
563     }
564     config = _PyInterpreterState_GetConfig(interp);
565 
566     if (config->_install_importlib) {
567         status = _PyPathConfig_UpdateGlobal(config);
568         if (_PyStatus_EXCEPTION(status)) {
569             return status;
570         }
571     }
572     return _PyStatus_OK();
573 }
574 
575 
576 static PyStatus
pycore_init_runtime(_PyRuntimeState * runtime,const PyConfig * config)577 pycore_init_runtime(_PyRuntimeState *runtime,
578                     const PyConfig *config)
579 {
580     if (runtime->initialized) {
581         return _PyStatus_ERR("main interpreter already initialized");
582     }
583 
584     PyStatus status = _PyConfig_Write(config, runtime);
585     if (_PyStatus_EXCEPTION(status)) {
586         return status;
587     }
588 
589     /* Py_Finalize leaves _Py_Finalizing set in order to help daemon
590      * threads behave a little more gracefully at interpreter shutdown.
591      * We clobber it here so the new interpreter can start with a clean
592      * slate.
593      *
594      * However, this may still lead to misbehaviour if there are daemon
595      * threads still hanging around from a previous Py_Initialize/Finalize
596      * pair :(
597      */
598     _PyRuntimeState_SetFinalizing(runtime, NULL);
599 
600     status = _Py_HashRandomization_Init(config);
601     if (_PyStatus_EXCEPTION(status)) {
602         return status;
603     }
604 
605     status = _PyInterpreterState_Enable(runtime);
606     if (_PyStatus_EXCEPTION(status)) {
607         return status;
608     }
609     return _PyStatus_OK();
610 }
611 
612 
613 static PyStatus
init_interp_create_gil(PyThreadState * tstate)614 init_interp_create_gil(PyThreadState *tstate)
615 {
616     PyStatus status;
617 
618     /* finalize_interp_delete() comment explains why _PyEval_FiniGIL() is
619        only called here. */
620     _PyEval_FiniGIL(tstate->interp);
621 
622     /* Auto-thread-state API */
623     status = _PyGILState_SetTstate(tstate);
624     if (_PyStatus_EXCEPTION(status)) {
625         return status;
626     }
627 
628     /* Create the GIL and take it */
629     status = _PyEval_InitGIL(tstate);
630     if (_PyStatus_EXCEPTION(status)) {
631         return status;
632     }
633 
634     return _PyStatus_OK();
635 }
636 
637 
638 static PyStatus
pycore_create_interpreter(_PyRuntimeState * runtime,const PyConfig * config,PyThreadState ** tstate_p)639 pycore_create_interpreter(_PyRuntimeState *runtime,
640                           const PyConfig *config,
641                           PyThreadState **tstate_p)
642 {
643     /* Auto-thread-state API */
644     PyStatus status = _PyGILState_Init(runtime);
645     if (_PyStatus_EXCEPTION(status)) {
646         return status;
647     }
648 
649     PyInterpreterState *interp = PyInterpreterState_New();
650     if (interp == NULL) {
651         return _PyStatus_ERR("can't make main interpreter");
652     }
653     assert(_Py_IsMainInterpreter(interp));
654 
655     status = _PyConfig_Copy(&interp->config, config);
656     if (_PyStatus_EXCEPTION(status)) {
657         return status;
658     }
659 
660     PyThreadState *tstate = PyThreadState_New(interp);
661     if (tstate == NULL) {
662         return _PyStatus_ERR("can't make first thread");
663     }
664     (void) PyThreadState_Swap(tstate);
665 
666     status = init_interp_create_gil(tstate);
667     if (_PyStatus_EXCEPTION(status)) {
668         return status;
669     }
670 
671     *tstate_p = tstate;
672     return _PyStatus_OK();
673 }
674 
675 
676 static PyStatus
pycore_init_global_objects(PyInterpreterState * interp)677 pycore_init_global_objects(PyInterpreterState *interp)
678 {
679     PyStatus status;
680 
681     _PyFloat_InitState(interp);
682 
683     status = _PyUnicode_InitGlobalObjects(interp);
684     if (_PyStatus_EXCEPTION(status)) {
685         return status;
686     }
687 
688     _PyUnicode_InitState(interp);
689 
690     return _PyStatus_OK();
691 }
692 
693 
694 static PyStatus
pycore_init_types(PyInterpreterState * interp)695 pycore_init_types(PyInterpreterState *interp)
696 {
697     PyStatus status;
698 
699     status = _PyTypes_InitState(interp);
700     if (_PyStatus_EXCEPTION(status)) {
701         return status;
702     }
703 
704     status = _PyTypes_InitTypes(interp);
705     if (_PyStatus_EXCEPTION(status)) {
706         return status;
707     }
708 
709     status = _PyBytes_InitTypes(interp);
710     if (_PyStatus_EXCEPTION(status)) {
711         return status;
712     }
713 
714     status = _PyLong_InitTypes(interp);
715     if (_PyStatus_EXCEPTION(status)) {
716         return status;
717     }
718 
719     status = _PyUnicode_InitTypes(interp);
720     if (_PyStatus_EXCEPTION(status)) {
721         return status;
722     }
723 
724     status = _PyFloat_InitTypes(interp);
725     if (_PyStatus_EXCEPTION(status)) {
726         return status;
727     }
728 
729     status = _PyTuple_InitTypes(interp);
730     if (_PyStatus_EXCEPTION(status)) {
731         return status;
732     }
733 
734     if (_PyExc_InitTypes(interp) < 0) {
735         return _PyStatus_ERR("failed to initialize an exception type");
736     }
737 
738     status = _PyExc_InitGlobalObjects(interp);
739     if (_PyStatus_EXCEPTION(status)) {
740         return status;
741     }
742 
743     status = _PyExc_InitState(interp);
744     if (_PyStatus_EXCEPTION(status)) {
745         return status;
746     }
747 
748     status = _PyErr_InitTypes(interp);
749     if (_PyStatus_EXCEPTION(status)) {
750         return status;
751     }
752 
753     status = _PyContext_Init(interp);
754     if (_PyStatus_EXCEPTION(status)) {
755         return status;
756     }
757     return _PyStatus_OK();
758 }
759 
760 
761 static PyStatus
pycore_init_builtins(PyThreadState * tstate)762 pycore_init_builtins(PyThreadState *tstate)
763 {
764     PyInterpreterState *interp = tstate->interp;
765 
766     PyObject *bimod = _PyBuiltin_Init(interp);
767     if (bimod == NULL) {
768         goto error;
769     }
770 
771     if (_PyImport_FixupBuiltin(bimod, "builtins", interp->modules) < 0) {
772         goto error;
773     }
774 
775     PyObject *builtins_dict = PyModule_GetDict(bimod);
776     if (builtins_dict == NULL) {
777         goto error;
778     }
779     Py_INCREF(builtins_dict);
780     interp->builtins = builtins_dict;
781 
782     PyObject *isinstance = PyDict_GetItem(builtins_dict, &_Py_ID(isinstance));
783     assert(isinstance);
784     interp->callable_cache.isinstance = isinstance;
785     PyObject *len = PyDict_GetItem(builtins_dict, &_Py_ID(len));
786     assert(len);
787     interp->callable_cache.len = len;
788     PyObject *list_append = _PyType_Lookup(&PyList_Type, &_Py_ID(append));
789     assert(list_append);
790     interp->callable_cache.list_append = list_append;
791 
792     if (_PyBuiltins_AddExceptions(bimod) < 0) {
793         return _PyStatus_ERR("failed to add exceptions to builtins");
794     }
795 
796     interp->builtins_copy = PyDict_Copy(interp->builtins);
797     if (interp->builtins_copy == NULL) {
798         goto error;
799     }
800     Py_DECREF(bimod);
801 
802     // Get the __import__ function
803     PyObject *import_func = _PyDict_GetItemStringWithError(interp->builtins,
804                                                            "__import__");
805     if (import_func == NULL) {
806         goto error;
807     }
808     interp->import_func = Py_NewRef(import_func);
809 
810     assert(!_PyErr_Occurred(tstate));
811     return _PyStatus_OK();
812 
813 error:
814     Py_XDECREF(bimod);
815     return _PyStatus_ERR("can't initialize builtins module");
816 }
817 
818 
819 static PyStatus
pycore_interp_init(PyThreadState * tstate)820 pycore_interp_init(PyThreadState *tstate)
821 {
822     PyInterpreterState *interp = tstate->interp;
823     PyStatus status;
824     PyObject *sysmod = NULL;
825 
826     // Create singletons before the first PyType_Ready() call, since
827     // PyType_Ready() uses singletons like the Unicode empty string (tp_doc)
828     // and the empty tuple singletons (tp_bases).
829     status = pycore_init_global_objects(interp);
830     if (_PyStatus_EXCEPTION(status)) {
831         return status;
832     }
833 
834     // The GC must be initialized before the first GC collection.
835     status = _PyGC_Init(interp);
836     if (_PyStatus_EXCEPTION(status)) {
837         return status;
838     }
839     // Intern strings in deep-frozen modules first so that others
840     // can use it instead of creating a heap allocated string.
841     if (_Py_Deepfreeze_Init() < 0) {
842         return _PyStatus_ERR("failed to initialize deep-frozen modules");
843     }
844 
845     status = pycore_init_types(interp);
846     if (_PyStatus_EXCEPTION(status)) {
847         goto done;
848     }
849 
850     if (_PyWarnings_InitState(interp) < 0) {
851         return _PyStatus_ERR("can't initialize warnings");
852     }
853 
854     status = _PyAtExit_Init(interp);
855     if (_PyStatus_EXCEPTION(status)) {
856         return status;
857     }
858 
859     status = _PySys_Create(tstate, &sysmod);
860     if (_PyStatus_EXCEPTION(status)) {
861         goto done;
862     }
863 
864     status = pycore_init_builtins(tstate);
865     if (_PyStatus_EXCEPTION(status)) {
866         goto done;
867     }
868 
869     const PyConfig *config = _PyInterpreterState_GetConfig(interp);
870     if (config->_install_importlib) {
871         /* This call sets up builtin and frozen import support */
872         if (init_importlib(tstate, sysmod) < 0) {
873             return _PyStatus_ERR("failed to initialize importlib");
874         }
875     }
876 
877 done:
878     /* sys.modules['sys'] contains a strong reference to the module */
879     Py_XDECREF(sysmod);
880     return status;
881 }
882 
883 
884 static PyStatus
pyinit_config(_PyRuntimeState * runtime,PyThreadState ** tstate_p,const PyConfig * config)885 pyinit_config(_PyRuntimeState *runtime,
886               PyThreadState **tstate_p,
887               const PyConfig *config)
888 {
889     PyStatus status = pycore_init_runtime(runtime, config);
890     if (_PyStatus_EXCEPTION(status)) {
891         return status;
892     }
893 
894     PyThreadState *tstate;
895     status = pycore_create_interpreter(runtime, config, &tstate);
896     if (_PyStatus_EXCEPTION(status)) {
897         return status;
898     }
899     *tstate_p = tstate;
900 
901     status = pycore_interp_init(tstate);
902     if (_PyStatus_EXCEPTION(status)) {
903         return status;
904     }
905 
906     /* Only when we get here is the runtime core fully initialized */
907     runtime->core_initialized = 1;
908     return _PyStatus_OK();
909 }
910 
911 
912 PyStatus
_Py_PreInitializeFromPyArgv(const PyPreConfig * src_config,const _PyArgv * args)913 _Py_PreInitializeFromPyArgv(const PyPreConfig *src_config, const _PyArgv *args)
914 {
915     PyStatus status;
916 
917     if (src_config == NULL) {
918         return _PyStatus_ERR("preinitialization config is NULL");
919     }
920 
921     status = _PyRuntime_Initialize();
922     if (_PyStatus_EXCEPTION(status)) {
923         return status;
924     }
925     _PyRuntimeState *runtime = &_PyRuntime;
926 
927     if (runtime->preinitialized) {
928         /* If it's already configured: ignored the new configuration */
929         return _PyStatus_OK();
930     }
931 
932     /* Note: preinitialized remains 1 on error, it is only set to 0
933        at exit on success. */
934     runtime->preinitializing = 1;
935 
936     PyPreConfig config;
937 
938     status = _PyPreConfig_InitFromPreConfig(&config, src_config);
939     if (_PyStatus_EXCEPTION(status)) {
940         return status;
941     }
942 
943     status = _PyPreConfig_Read(&config, args);
944     if (_PyStatus_EXCEPTION(status)) {
945         return status;
946     }
947 
948     status = _PyPreConfig_Write(&config);
949     if (_PyStatus_EXCEPTION(status)) {
950         return status;
951     }
952 
953     runtime->preinitializing = 0;
954     runtime->preinitialized = 1;
955     return _PyStatus_OK();
956 }
957 
958 
959 PyStatus
Py_PreInitializeFromBytesArgs(const PyPreConfig * src_config,Py_ssize_t argc,char ** argv)960 Py_PreInitializeFromBytesArgs(const PyPreConfig *src_config, Py_ssize_t argc, char **argv)
961 {
962     _PyArgv args = {.use_bytes_argv = 1, .argc = argc, .bytes_argv = argv};
963     return _Py_PreInitializeFromPyArgv(src_config, &args);
964 }
965 
966 
967 PyStatus
Py_PreInitializeFromArgs(const PyPreConfig * src_config,Py_ssize_t argc,wchar_t ** argv)968 Py_PreInitializeFromArgs(const PyPreConfig *src_config, Py_ssize_t argc, wchar_t **argv)
969 {
970     _PyArgv args = {.use_bytes_argv = 0, .argc = argc, .wchar_argv = argv};
971     return _Py_PreInitializeFromPyArgv(src_config, &args);
972 }
973 
974 
975 PyStatus
Py_PreInitialize(const PyPreConfig * src_config)976 Py_PreInitialize(const PyPreConfig *src_config)
977 {
978     return _Py_PreInitializeFromPyArgv(src_config, NULL);
979 }
980 
981 
982 PyStatus
_Py_PreInitializeFromConfig(const PyConfig * config,const _PyArgv * args)983 _Py_PreInitializeFromConfig(const PyConfig *config,
984                             const _PyArgv *args)
985 {
986     assert(config != NULL);
987 
988     PyStatus status = _PyRuntime_Initialize();
989     if (_PyStatus_EXCEPTION(status)) {
990         return status;
991     }
992     _PyRuntimeState *runtime = &_PyRuntime;
993 
994     if (runtime->preinitialized) {
995         /* Already initialized: do nothing */
996         return _PyStatus_OK();
997     }
998 
999     PyPreConfig preconfig;
1000 
1001     _PyPreConfig_InitFromConfig(&preconfig, config);
1002 
1003     if (!config->parse_argv) {
1004         return Py_PreInitialize(&preconfig);
1005     }
1006     else if (args == NULL) {
1007         _PyArgv config_args = {
1008             .use_bytes_argv = 0,
1009             .argc = config->argv.length,
1010             .wchar_argv = config->argv.items};
1011         return _Py_PreInitializeFromPyArgv(&preconfig, &config_args);
1012     }
1013     else {
1014         return _Py_PreInitializeFromPyArgv(&preconfig, args);
1015     }
1016 }
1017 
1018 
1019 /* Begin interpreter initialization
1020  *
1021  * On return, the first thread and interpreter state have been created,
1022  * but the compiler, signal handling, multithreading and
1023  * multiple interpreter support, and codec infrastructure are not yet
1024  * available.
1025  *
1026  * The import system will support builtin and frozen modules only.
1027  * The only supported io is writing to sys.stderr
1028  *
1029  * If any operation invoked by this function fails, a fatal error is
1030  * issued and the function does not return.
1031  *
1032  * Any code invoked from this function should *not* assume it has access
1033  * to the Python C API (unless the API is explicitly listed as being
1034  * safe to call without calling Py_Initialize first)
1035  */
1036 static PyStatus
pyinit_core(_PyRuntimeState * runtime,const PyConfig * src_config,PyThreadState ** tstate_p)1037 pyinit_core(_PyRuntimeState *runtime,
1038             const PyConfig *src_config,
1039             PyThreadState **tstate_p)
1040 {
1041     PyStatus status;
1042 
1043     status = _Py_PreInitializeFromConfig(src_config, NULL);
1044     if (_PyStatus_EXCEPTION(status)) {
1045         return status;
1046     }
1047 
1048     PyConfig config;
1049     PyConfig_InitPythonConfig(&config);
1050 
1051     status = _PyConfig_Copy(&config, src_config);
1052     if (_PyStatus_EXCEPTION(status)) {
1053         goto done;
1054     }
1055 
1056     // Read the configuration, but don't compute the path configuration
1057     // (it is computed in the main init).
1058     status = _PyConfig_Read(&config, 0);
1059     if (_PyStatus_EXCEPTION(status)) {
1060         goto done;
1061     }
1062 
1063     if (!runtime->core_initialized) {
1064         status = pyinit_config(runtime, tstate_p, &config);
1065     }
1066     else {
1067         status = pyinit_core_reconfigure(runtime, tstate_p, &config);
1068     }
1069     if (_PyStatus_EXCEPTION(status)) {
1070         goto done;
1071     }
1072 
1073 done:
1074     PyConfig_Clear(&config);
1075     return status;
1076 }
1077 
1078 
1079 /* Py_Initialize() has already been called: update the main interpreter
1080    configuration. Example of bpo-34008: Py_Main() called after
1081    Py_Initialize(). */
1082 static PyStatus
pyinit_main_reconfigure(PyThreadState * tstate)1083 pyinit_main_reconfigure(PyThreadState *tstate)
1084 {
1085     if (interpreter_update_config(tstate, 0) < 0) {
1086         return _PyStatus_ERR("fail to reconfigure Python");
1087     }
1088     return _PyStatus_OK();
1089 }
1090 
1091 
1092 static PyStatus
init_interp_main(PyThreadState * tstate)1093 init_interp_main(PyThreadState *tstate)
1094 {
1095     extern void _PyThread_debug_deprecation(void);
1096 
1097     assert(!_PyErr_Occurred(tstate));
1098 
1099     PyStatus status;
1100     int is_main_interp = _Py_IsMainInterpreter(tstate->interp);
1101     PyInterpreterState *interp = tstate->interp;
1102     const PyConfig *config = _PyInterpreterState_GetConfig(interp);
1103 
1104     if (!config->_install_importlib) {
1105         /* Special mode for freeze_importlib: run with no import system
1106          *
1107          * This means anything which needs support from extension modules
1108          * or pure Python code in the standard library won't work.
1109          */
1110         if (is_main_interp) {
1111             interp->runtime->initialized = 1;
1112         }
1113         return _PyStatus_OK();
1114     }
1115 
1116     // Initialize the import-related configuration.
1117     status = _PyConfig_InitImportConfig(&interp->config);
1118     if (_PyStatus_EXCEPTION(status)) {
1119         return status;
1120     }
1121 
1122     if (interpreter_update_config(tstate, 1) < 0) {
1123         return _PyStatus_ERR("failed to update the Python config");
1124     }
1125 
1126     status = init_importlib_external(tstate);
1127     if (_PyStatus_EXCEPTION(status)) {
1128         return status;
1129     }
1130 
1131     if (is_main_interp) {
1132         /* initialize the faulthandler module */
1133         status = _PyFaulthandler_Init(config->faulthandler);
1134         if (_PyStatus_EXCEPTION(status)) {
1135             return status;
1136         }
1137     }
1138 
1139     status = _PyUnicode_InitEncodings(tstate);
1140     if (_PyStatus_EXCEPTION(status)) {
1141         return status;
1142     }
1143 
1144     if (is_main_interp) {
1145         if (_PySignal_Init(config->install_signal_handlers) < 0) {
1146             return _PyStatus_ERR("can't initialize signals");
1147         }
1148 
1149         if (_PyTraceMalloc_Init(config->tracemalloc) < 0) {
1150             return _PyStatus_ERR("can't initialize tracemalloc");
1151         }
1152     }
1153 
1154     status = init_sys_streams(tstate);
1155     if (_PyStatus_EXCEPTION(status)) {
1156         return status;
1157     }
1158 
1159     status = init_set_builtins_open();
1160     if (_PyStatus_EXCEPTION(status)) {
1161         return status;
1162     }
1163 
1164     status = add_main_module(interp);
1165     if (_PyStatus_EXCEPTION(status)) {
1166         return status;
1167     }
1168 
1169     if (is_main_interp) {
1170         /* Initialize warnings. */
1171         PyObject *warnoptions = PySys_GetObject("warnoptions");
1172         if (warnoptions != NULL && PyList_Size(warnoptions) > 0)
1173         {
1174             PyObject *warnings_module = PyImport_ImportModule("warnings");
1175             if (warnings_module == NULL) {
1176                 fprintf(stderr, "'import warnings' failed; traceback:\n");
1177                 _PyErr_Print(tstate);
1178             }
1179             Py_XDECREF(warnings_module);
1180         }
1181 
1182         interp->runtime->initialized = 1;
1183     }
1184 
1185     if (config->site_import) {
1186         status = init_import_site();
1187         if (_PyStatus_EXCEPTION(status)) {
1188             return status;
1189         }
1190     }
1191 
1192     if (is_main_interp) {
1193 #ifndef MS_WINDOWS
1194         emit_stderr_warning_for_legacy_locale(interp->runtime);
1195 #endif
1196     }
1197 
1198     // Warn about PYTHONTHREADDEBUG deprecation
1199     _PyThread_debug_deprecation();
1200 
1201     assert(!_PyErr_Occurred(tstate));
1202 
1203     return _PyStatus_OK();
1204 }
1205 
1206 
1207 /* Update interpreter state based on supplied configuration settings
1208  *
1209  * After calling this function, most of the restrictions on the interpreter
1210  * are lifted. The only remaining incomplete settings are those related
1211  * to the main module (sys.argv[0], __main__ metadata)
1212  *
1213  * Calling this when the interpreter is not initializing, is already
1214  * initialized or without a valid current thread state is a fatal error.
1215  * Other errors should be reported as normal Python exceptions with a
1216  * non-zero return code.
1217  */
1218 static PyStatus
pyinit_main(PyThreadState * tstate)1219 pyinit_main(PyThreadState *tstate)
1220 {
1221     PyInterpreterState *interp = tstate->interp;
1222     if (!interp->runtime->core_initialized) {
1223         return _PyStatus_ERR("runtime core not initialized");
1224     }
1225 
1226     if (interp->runtime->initialized) {
1227         return pyinit_main_reconfigure(tstate);
1228     }
1229 
1230     PyStatus status = init_interp_main(tstate);
1231     if (_PyStatus_EXCEPTION(status)) {
1232         return status;
1233     }
1234     return _PyStatus_OK();
1235 }
1236 
1237 
1238 PyStatus
Py_InitializeFromConfig(const PyConfig * config)1239 Py_InitializeFromConfig(const PyConfig *config)
1240 {
1241     if (config == NULL) {
1242         return _PyStatus_ERR("initialization config is NULL");
1243     }
1244 
1245     PyStatus status;
1246 
1247     status = _PyRuntime_Initialize();
1248     if (_PyStatus_EXCEPTION(status)) {
1249         return status;
1250     }
1251     _PyRuntimeState *runtime = &_PyRuntime;
1252 
1253     PyThreadState *tstate = NULL;
1254     status = pyinit_core(runtime, config, &tstate);
1255     if (_PyStatus_EXCEPTION(status)) {
1256         return status;
1257     }
1258     config = _PyInterpreterState_GetConfig(tstate->interp);
1259 
1260     if (config->_init_main) {
1261         status = pyinit_main(tstate);
1262         if (_PyStatus_EXCEPTION(status)) {
1263             return status;
1264         }
1265     }
1266 
1267     return _PyStatus_OK();
1268 }
1269 
1270 
1271 void
Py_InitializeEx(int install_sigs)1272 Py_InitializeEx(int install_sigs)
1273 {
1274     PyStatus status;
1275 
1276     status = _PyRuntime_Initialize();
1277     if (_PyStatus_EXCEPTION(status)) {
1278         Py_ExitStatusException(status);
1279     }
1280     _PyRuntimeState *runtime = &_PyRuntime;
1281 
1282     if (runtime->initialized) {
1283         /* bpo-33932: Calling Py_Initialize() twice does nothing. */
1284         return;
1285     }
1286 
1287     PyConfig config;
1288     _PyConfig_InitCompatConfig(&config);
1289 
1290     config.install_signal_handlers = install_sigs;
1291 
1292     status = Py_InitializeFromConfig(&config);
1293     PyConfig_Clear(&config);
1294     if (_PyStatus_EXCEPTION(status)) {
1295         Py_ExitStatusException(status);
1296     }
1297 }
1298 
1299 void
Py_Initialize(void)1300 Py_Initialize(void)
1301 {
1302     Py_InitializeEx(1);
1303 }
1304 
1305 
1306 PyStatus
_Py_InitializeMain(void)1307 _Py_InitializeMain(void)
1308 {
1309     PyStatus status = _PyRuntime_Initialize();
1310     if (_PyStatus_EXCEPTION(status)) {
1311         return status;
1312     }
1313     _PyRuntimeState *runtime = &_PyRuntime;
1314     PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
1315     return pyinit_main(tstate);
1316 }
1317 
1318 
1319 static void
finalize_modules_delete_special(PyThreadState * tstate,int verbose)1320 finalize_modules_delete_special(PyThreadState *tstate, int verbose)
1321 {
1322     // List of names to clear in sys
1323     static const char * const sys_deletes[] = {
1324         "path", "argv", "ps1", "ps2",
1325         "last_type", "last_value", "last_traceback",
1326         "path_hooks", "path_importer_cache", "meta_path",
1327         "__interactivehook__",
1328         NULL
1329     };
1330 
1331     static const char * const sys_files[] = {
1332         "stdin", "__stdin__",
1333         "stdout", "__stdout__",
1334         "stderr", "__stderr__",
1335         NULL
1336     };
1337 
1338     PyInterpreterState *interp = tstate->interp;
1339     if (verbose) {
1340         PySys_WriteStderr("# clear builtins._\n");
1341     }
1342     if (PyDict_SetItemString(interp->builtins, "_", Py_None) < 0) {
1343         PyErr_WriteUnraisable(NULL);
1344     }
1345 
1346     const char * const *p;
1347     for (p = sys_deletes; *p != NULL; p++) {
1348         if (verbose) {
1349             PySys_WriteStderr("# clear sys.%s\n", *p);
1350         }
1351         if (PyDict_SetItemString(interp->sysdict, *p, Py_None) < 0) {
1352             PyErr_WriteUnraisable(NULL);
1353         }
1354     }
1355     for (p = sys_files; *p != NULL; p+=2) {
1356         const char *name = p[0];
1357         const char *orig_name = p[1];
1358         if (verbose) {
1359             PySys_WriteStderr("# restore sys.%s\n", name);
1360         }
1361         PyObject *value = _PyDict_GetItemStringWithError(interp->sysdict,
1362                                                          orig_name);
1363         if (value == NULL) {
1364             if (_PyErr_Occurred(tstate)) {
1365                 PyErr_WriteUnraisable(NULL);
1366             }
1367             value = Py_None;
1368         }
1369         if (PyDict_SetItemString(interp->sysdict, name, value) < 0) {
1370             PyErr_WriteUnraisable(NULL);
1371         }
1372     }
1373 }
1374 
1375 
1376 static PyObject*
finalize_remove_modules(PyObject * modules,int verbose)1377 finalize_remove_modules(PyObject *modules, int verbose)
1378 {
1379     PyObject *weaklist = PyList_New(0);
1380     if (weaklist == NULL) {
1381         PyErr_WriteUnraisable(NULL);
1382     }
1383 
1384 #define STORE_MODULE_WEAKREF(name, mod) \
1385         if (weaklist != NULL) { \
1386             PyObject *wr = PyWeakref_NewRef(mod, NULL); \
1387             if (wr) { \
1388                 PyObject *tup = PyTuple_Pack(2, name, wr); \
1389                 if (!tup || PyList_Append(weaklist, tup) < 0) { \
1390                     PyErr_WriteUnraisable(NULL); \
1391                 } \
1392                 Py_XDECREF(tup); \
1393                 Py_DECREF(wr); \
1394             } \
1395             else { \
1396                 PyErr_WriteUnraisable(NULL); \
1397             } \
1398         }
1399 
1400 #define CLEAR_MODULE(name, mod) \
1401         if (PyModule_Check(mod)) { \
1402             if (verbose && PyUnicode_Check(name)) { \
1403                 PySys_FormatStderr("# cleanup[2] removing %U\n", name); \
1404             } \
1405             STORE_MODULE_WEAKREF(name, mod); \
1406             if (PyObject_SetItem(modules, name, Py_None) < 0) { \
1407                 PyErr_WriteUnraisable(NULL); \
1408             } \
1409         }
1410 
1411     if (PyDict_CheckExact(modules)) {
1412         Py_ssize_t pos = 0;
1413         PyObject *key, *value;
1414         while (PyDict_Next(modules, &pos, &key, &value)) {
1415             CLEAR_MODULE(key, value);
1416         }
1417     }
1418     else {
1419         PyObject *iterator = PyObject_GetIter(modules);
1420         if (iterator == NULL) {
1421             PyErr_WriteUnraisable(NULL);
1422         }
1423         else {
1424             PyObject *key;
1425             while ((key = PyIter_Next(iterator))) {
1426                 PyObject *value = PyObject_GetItem(modules, key);
1427                 if (value == NULL) {
1428                     PyErr_WriteUnraisable(NULL);
1429                     continue;
1430                 }
1431                 CLEAR_MODULE(key, value);
1432                 Py_DECREF(value);
1433                 Py_DECREF(key);
1434             }
1435             if (PyErr_Occurred()) {
1436                 PyErr_WriteUnraisable(NULL);
1437             }
1438             Py_DECREF(iterator);
1439         }
1440     }
1441 #undef CLEAR_MODULE
1442 #undef STORE_MODULE_WEAKREF
1443 
1444     return weaklist;
1445 }
1446 
1447 
1448 static void
finalize_clear_modules_dict(PyObject * modules)1449 finalize_clear_modules_dict(PyObject *modules)
1450 {
1451     if (PyDict_CheckExact(modules)) {
1452         PyDict_Clear(modules);
1453     }
1454     else {
1455         if (PyObject_CallMethodNoArgs(modules, &_Py_ID(clear)) == NULL) {
1456             PyErr_WriteUnraisable(NULL);
1457         }
1458     }
1459 }
1460 
1461 
1462 static void
finalize_restore_builtins(PyThreadState * tstate)1463 finalize_restore_builtins(PyThreadState *tstate)
1464 {
1465     PyInterpreterState *interp = tstate->interp;
1466     PyObject *dict = PyDict_Copy(interp->builtins);
1467     if (dict == NULL) {
1468         PyErr_WriteUnraisable(NULL);
1469     }
1470     PyDict_Clear(interp->builtins);
1471     if (PyDict_Update(interp->builtins, interp->builtins_copy)) {
1472         _PyErr_Clear(tstate);
1473     }
1474     Py_XDECREF(dict);
1475 }
1476 
1477 
1478 static void
finalize_modules_clear_weaklist(PyInterpreterState * interp,PyObject * weaklist,int verbose)1479 finalize_modules_clear_weaklist(PyInterpreterState *interp,
1480                                 PyObject *weaklist, int verbose)
1481 {
1482     // First clear modules imported later
1483     for (Py_ssize_t i = PyList_GET_SIZE(weaklist) - 1; i >= 0; i--) {
1484         PyObject *tup = PyList_GET_ITEM(weaklist, i);
1485         PyObject *name = PyTuple_GET_ITEM(tup, 0);
1486         PyObject *mod = PyWeakref_GET_OBJECT(PyTuple_GET_ITEM(tup, 1));
1487         if (mod == Py_None) {
1488             continue;
1489         }
1490         assert(PyModule_Check(mod));
1491         PyObject *dict = PyModule_GetDict(mod);
1492         if (dict == interp->builtins || dict == interp->sysdict) {
1493             continue;
1494         }
1495         Py_INCREF(mod);
1496         if (verbose && PyUnicode_Check(name)) {
1497             PySys_FormatStderr("# cleanup[3] wiping %U\n", name);
1498         }
1499         _PyModule_Clear(mod);
1500         Py_DECREF(mod);
1501     }
1502 }
1503 
1504 
1505 static void
finalize_clear_sys_builtins_dict(PyInterpreterState * interp,int verbose)1506 finalize_clear_sys_builtins_dict(PyInterpreterState *interp, int verbose)
1507 {
1508     // Clear sys dict
1509     if (verbose) {
1510         PySys_FormatStderr("# cleanup[3] wiping sys\n");
1511     }
1512     _PyModule_ClearDict(interp->sysdict);
1513 
1514     // Clear builtins dict
1515     if (verbose) {
1516         PySys_FormatStderr("# cleanup[3] wiping builtins\n");
1517     }
1518     _PyModule_ClearDict(interp->builtins);
1519 }
1520 
1521 
1522 /* Clear modules, as good as we can */
1523 static void
finalize_modules(PyThreadState * tstate)1524 finalize_modules(PyThreadState *tstate)
1525 {
1526     PyInterpreterState *interp = tstate->interp;
1527     PyObject *modules = interp->modules;
1528     if (modules == NULL) {
1529         // Already done
1530         return;
1531     }
1532     int verbose = _PyInterpreterState_GetConfig(interp)->verbose;
1533 
1534     // Delete some special builtins._ and sys attributes first.  These are
1535     // common places where user values hide and people complain when their
1536     // destructors fail.  Since the modules containing them are
1537     // deleted *last* of all, they would come too late in the normal
1538     // destruction order.  Sigh.
1539     //
1540     // XXX Perhaps these precautions are obsolete. Who knows?
1541     finalize_modules_delete_special(tstate, verbose);
1542 
1543     // Remove all modules from sys.modules, hoping that garbage collection
1544     // can reclaim most of them: set all sys.modules values to None.
1545     //
1546     // We prepare a list which will receive (name, weakref) tuples of
1547     // modules when they are removed from sys.modules.  The name is used
1548     // for diagnosis messages (in verbose mode), while the weakref helps
1549     // detect those modules which have been held alive.
1550     PyObject *weaklist = finalize_remove_modules(modules, verbose);
1551 
1552     // Clear the modules dict
1553     finalize_clear_modules_dict(modules);
1554 
1555     // Restore the original builtins dict, to ensure that any
1556     // user data gets cleared.
1557     finalize_restore_builtins(tstate);
1558 
1559     // Collect garbage
1560     _PyGC_CollectNoFail(tstate);
1561 
1562     // Dump GC stats before it's too late, since it uses the warnings
1563     // machinery.
1564     _PyGC_DumpShutdownStats(interp);
1565 
1566     if (weaklist != NULL) {
1567         // Now, if there are any modules left alive, clear their globals to
1568         // minimize potential leaks.  All C extension modules actually end
1569         // up here, since they are kept alive in the interpreter state.
1570         //
1571         // The special treatment of "builtins" here is because even
1572         // when it's not referenced as a module, its dictionary is
1573         // referenced by almost every module's __builtins__.  Since
1574         // deleting a module clears its dictionary (even if there are
1575         // references left to it), we need to delete the "builtins"
1576         // module last.  Likewise, we don't delete sys until the very
1577         // end because it is implicitly referenced (e.g. by print).
1578         //
1579         // Since dict is ordered in CPython 3.6+, modules are saved in
1580         // importing order.  First clear modules imported later.
1581         finalize_modules_clear_weaklist(interp, weaklist, verbose);
1582         Py_DECREF(weaklist);
1583     }
1584 
1585     // Clear sys and builtins modules dict
1586     finalize_clear_sys_builtins_dict(interp, verbose);
1587 
1588     // Clear module dict copies stored in the interpreter state:
1589     // clear PyInterpreterState.modules_by_index and
1590     // clear PyModuleDef.m_base.m_copy (of extensions not using the multi-phase
1591     // initialization API)
1592     _PyInterpreterState_ClearModules(interp);
1593 
1594     // Clear and delete the modules directory.  Actual modules will
1595     // still be there only if imported during the execution of some
1596     // destructor.
1597     Py_SETREF(interp->modules, NULL);
1598 
1599     // Collect garbage once more
1600     _PyGC_CollectNoFail(tstate);
1601 }
1602 
1603 
1604 /* Flush stdout and stderr */
1605 
1606 static int
file_is_closed(PyObject * fobj)1607 file_is_closed(PyObject *fobj)
1608 {
1609     int r;
1610     PyObject *tmp = PyObject_GetAttrString(fobj, "closed");
1611     if (tmp == NULL) {
1612         PyErr_Clear();
1613         return 0;
1614     }
1615     r = PyObject_IsTrue(tmp);
1616     Py_DECREF(tmp);
1617     if (r < 0)
1618         PyErr_Clear();
1619     return r > 0;
1620 }
1621 
1622 
1623 static int
flush_std_files(void)1624 flush_std_files(void)
1625 {
1626     PyThreadState *tstate = _PyThreadState_GET();
1627     PyObject *fout = _PySys_GetAttr(tstate, &_Py_ID(stdout));
1628     PyObject *ferr = _PySys_GetAttr(tstate, &_Py_ID(stderr));
1629     PyObject *tmp;
1630     int status = 0;
1631 
1632     if (fout != NULL && fout != Py_None && !file_is_closed(fout)) {
1633         tmp = PyObject_CallMethodNoArgs(fout, &_Py_ID(flush));
1634         if (tmp == NULL) {
1635             PyErr_WriteUnraisable(fout);
1636             status = -1;
1637         }
1638         else
1639             Py_DECREF(tmp);
1640     }
1641 
1642     if (ferr != NULL && ferr != Py_None && !file_is_closed(ferr)) {
1643         tmp = PyObject_CallMethodNoArgs(ferr, &_Py_ID(flush));
1644         if (tmp == NULL) {
1645             PyErr_Clear();
1646             status = -1;
1647         }
1648         else
1649             Py_DECREF(tmp);
1650     }
1651 
1652     return status;
1653 }
1654 
1655 /* Undo the effect of Py_Initialize().
1656 
1657    Beware: if multiple interpreter and/or thread states exist, these
1658    are not wiped out; only the current thread and interpreter state
1659    are deleted.  But since everything else is deleted, those other
1660    interpreter and thread states should no longer be used.
1661 
1662    (XXX We should do better, e.g. wipe out all interpreters and
1663    threads.)
1664 
1665    Locking: as above.
1666 
1667 */
1668 
1669 
1670 static void
finalize_interp_types(PyInterpreterState * interp)1671 finalize_interp_types(PyInterpreterState *interp)
1672 {
1673     _PyUnicode_FiniTypes(interp);
1674     _PySys_Fini(interp);
1675     _PyExc_Fini(interp);
1676     _PyAsyncGen_Fini(interp);
1677     _PyContext_Fini(interp);
1678     _PyFloat_FiniType(interp);
1679     _PyLong_FiniTypes(interp);
1680     _PyThread_FiniType(interp);
1681     _PyErr_FiniTypes(interp);
1682     _PyTypes_Fini(interp);
1683     _PyTypes_FiniTypes(interp);
1684 
1685     // Call _PyUnicode_ClearInterned() before _PyDict_Fini() since it uses
1686     // a dict internally.
1687     _PyUnicode_ClearInterned(interp);
1688 
1689     _PyDict_Fini(interp);
1690     _PyList_Fini(interp);
1691     _PyTuple_Fini(interp);
1692 
1693     _PySlice_Fini(interp);
1694 
1695     _PyUnicode_Fini(interp);
1696     _PyFloat_Fini(interp);
1697 }
1698 
1699 
1700 static void
finalize_interp_clear(PyThreadState * tstate)1701 finalize_interp_clear(PyThreadState *tstate)
1702 {
1703     int is_main_interp = _Py_IsMainInterpreter(tstate->interp);
1704 
1705     _PyExc_ClearExceptionGroupType(tstate->interp);
1706 
1707     /* Clear interpreter state and all thread states */
1708     _PyInterpreterState_Clear(tstate);
1709 
1710     if (is_main_interp) {
1711         _PyIO_Fini();
1712     }
1713 
1714     /* Clear all loghooks */
1715     /* Both _PySys_Audit function and users still need PyObject, such as tuple.
1716        Call _PySys_ClearAuditHooks when PyObject available. */
1717     if (is_main_interp) {
1718         _PySys_ClearAuditHooks(tstate);
1719     }
1720 
1721     if (is_main_interp) {
1722         _Py_HashRandomization_Fini();
1723         _PyArg_Fini();
1724         _Py_ClearFileSystemEncoding();
1725         _Py_Deepfreeze_Fini();
1726     }
1727 
1728     finalize_interp_types(tstate->interp);
1729 }
1730 
1731 
1732 static void
finalize_interp_delete(PyInterpreterState * interp)1733 finalize_interp_delete(PyInterpreterState *interp)
1734 {
1735     if (_Py_IsMainInterpreter(interp)) {
1736         /* Cleanup auto-thread-state */
1737         _PyGILState_Fini(interp);
1738     }
1739 
1740     /* We can't call _PyEval_FiniGIL() here because destroying the GIL lock can
1741        fail when it is being awaited by another running daemon thread (see
1742        bpo-9901). Instead pycore_create_interpreter() destroys the previously
1743        created GIL, which ensures that Py_Initialize / Py_FinalizeEx can be
1744        called multiple times. */
1745 
1746     PyInterpreterState_Delete(interp);
1747 }
1748 
1749 
1750 int
Py_FinalizeEx(void)1751 Py_FinalizeEx(void)
1752 {
1753     int status = 0;
1754 
1755     _PyRuntimeState *runtime = &_PyRuntime;
1756     if (!runtime->initialized) {
1757         return status;
1758     }
1759 
1760     /* Get current thread state and interpreter pointer */
1761     PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
1762 
1763     // Wrap up existing "threading"-module-created, non-daemon threads.
1764     wait_for_thread_shutdown(tstate);
1765 
1766     // Make any remaining pending calls.
1767     _Py_FinishPendingCalls(tstate);
1768 
1769     /* The interpreter is still entirely intact at this point, and the
1770      * exit funcs may be relying on that.  In particular, if some thread
1771      * or exit func is still waiting to do an import, the import machinery
1772      * expects Py_IsInitialized() to return true.  So don't say the
1773      * runtime is uninitialized until after the exit funcs have run.
1774      * Note that Threading.py uses an exit func to do a join on all the
1775      * threads created thru it, so this also protects pending imports in
1776      * the threads created via Threading.
1777      */
1778 
1779     _PyAtExit_Call(tstate->interp);
1780 
1781     /* Copy the core config, PyInterpreterState_Delete() free
1782        the core config memory */
1783 #ifdef Py_REF_DEBUG
1784     int show_ref_count = tstate->interp->config.show_ref_count;
1785 #endif
1786 #ifdef Py_TRACE_REFS
1787     int dump_refs = tstate->interp->config.dump_refs;
1788     wchar_t *dump_refs_file = tstate->interp->config.dump_refs_file;
1789 #endif
1790 #ifdef WITH_PYMALLOC
1791     int malloc_stats = tstate->interp->config.malloc_stats;
1792 #endif
1793 
1794     /* Remaining daemon threads will automatically exit
1795        when they attempt to take the GIL (ex: PyEval_RestoreThread()). */
1796     _PyRuntimeState_SetFinalizing(runtime, tstate);
1797     runtime->initialized = 0;
1798     runtime->core_initialized = 0;
1799 
1800     /* Destroy the state of all threads of the interpreter, except of the
1801        current thread. In practice, only daemon threads should still be alive,
1802        except if wait_for_thread_shutdown() has been cancelled by CTRL+C.
1803        Clear frames of other threads to call objects destructors. Destructors
1804        will be called in the current Python thread. Since
1805        _PyRuntimeState_SetFinalizing() has been called, no other Python thread
1806        can take the GIL at this point: if they try, they will exit
1807        immediately. */
1808     _PyThreadState_DeleteExcept(runtime, tstate);
1809 
1810     /* Flush sys.stdout and sys.stderr */
1811     if (flush_std_files() < 0) {
1812         status = -1;
1813     }
1814 
1815     /* Disable signal handling */
1816     _PySignal_Fini();
1817 
1818     /* Collect garbage.  This may call finalizers; it's nice to call these
1819      * before all modules are destroyed.
1820      * XXX If a __del__ or weakref callback is triggered here, and tries to
1821      * XXX import a module, bad things can happen, because Python no
1822      * XXX longer believes it's initialized.
1823      * XXX     Fatal Python error: Interpreter not initialized (version mismatch?)
1824      * XXX is easy to provoke that way.  I've also seen, e.g.,
1825      * XXX     Exception exceptions.ImportError: 'No module named sha'
1826      * XXX         in <function callback at 0x008F5718> ignored
1827      * XXX but I'm unclear on exactly how that one happens.  In any case,
1828      * XXX I haven't seen a real-life report of either of these.
1829      */
1830     PyGC_Collect();
1831 
1832     /* Destroy all modules */
1833     finalize_modules(tstate);
1834 
1835     /* Print debug stats if any */
1836     _PyEval_Fini();
1837 
1838     /* Flush sys.stdout and sys.stderr (again, in case more was printed) */
1839     if (flush_std_files() < 0) {
1840         status = -1;
1841     }
1842 
1843     /* Collect final garbage.  This disposes of cycles created by
1844      * class definitions, for example.
1845      * XXX This is disabled because it caused too many problems.  If
1846      * XXX a __del__ or weakref callback triggers here, Python code has
1847      * XXX a hard time running, because even the sys module has been
1848      * XXX cleared out (sys.stdout is gone, sys.excepthook is gone, etc).
1849      * XXX One symptom is a sequence of information-free messages
1850      * XXX coming from threads (if a __del__ or callback is invoked,
1851      * XXX other threads can execute too, and any exception they encounter
1852      * XXX triggers a comedy of errors as subsystem after subsystem
1853      * XXX fails to find what it *expects* to find in sys to help report
1854      * XXX the exception and consequent unexpected failures).  I've also
1855      * XXX seen segfaults then, after adding print statements to the
1856      * XXX Python code getting called.
1857      */
1858 #if 0
1859     _PyGC_CollectIfEnabled();
1860 #endif
1861 
1862     /* Disable tracemalloc after all Python objects have been destroyed,
1863        so it is possible to use tracemalloc in objects destructor. */
1864     _PyTraceMalloc_Fini();
1865 
1866     /* Destroy the database used by _PyImport_{Fixup,Find}Extension */
1867     _PyImport_Fini();
1868 
1869     /* unload faulthandler module */
1870     _PyFaulthandler_Fini();
1871 
1872     /* dump hash stats */
1873     _PyHash_Fini();
1874 
1875 #ifdef Py_TRACE_REFS
1876     /* Display all objects still alive -- this can invoke arbitrary
1877      * __repr__ overrides, so requires a mostly-intact interpreter.
1878      * Alas, a lot of stuff may still be alive now that will be cleaned
1879      * up later.
1880      */
1881 
1882     FILE *dump_refs_fp = NULL;
1883     if (dump_refs_file != NULL) {
1884         dump_refs_fp = _Py_wfopen(dump_refs_file, L"w");
1885         if (dump_refs_fp == NULL) {
1886             fprintf(stderr, "PYTHONDUMPREFSFILE: cannot create file: %ls\n", dump_refs_file);
1887         }
1888     }
1889 
1890     if (dump_refs) {
1891         _Py_PrintReferences(stderr);
1892     }
1893 
1894     if (dump_refs_fp != NULL) {
1895         _Py_PrintReferences(dump_refs_fp);
1896     }
1897 #endif /* Py_TRACE_REFS */
1898 
1899     finalize_interp_clear(tstate);
1900     finalize_interp_delete(tstate->interp);
1901 
1902 #ifdef Py_REF_DEBUG
1903     if (show_ref_count) {
1904         _PyDebug_PrintTotalRefs();
1905     }
1906 #endif
1907 
1908 #ifdef Py_TRACE_REFS
1909     /* Display addresses (& refcnts) of all objects still alive.
1910      * An address can be used to find the repr of the object, printed
1911      * above by _Py_PrintReferences.
1912      */
1913 
1914     if (dump_refs) {
1915         _Py_PrintReferenceAddresses(stderr);
1916     }
1917 
1918     if (dump_refs_fp != NULL) {
1919         _Py_PrintReferenceAddresses(dump_refs_fp);
1920         fclose(dump_refs_fp);
1921     }
1922 #endif /* Py_TRACE_REFS */
1923 #ifdef WITH_PYMALLOC
1924     if (malloc_stats) {
1925         _PyObject_DebugMallocStats(stderr);
1926     }
1927 #endif
1928 
1929     call_ll_exitfuncs(runtime);
1930 
1931     _PyRuntime_Finalize();
1932     return status;
1933 }
1934 
1935 void
Py_Finalize(void)1936 Py_Finalize(void)
1937 {
1938     Py_FinalizeEx();
1939 }
1940 
1941 
1942 /* Create and initialize a new interpreter and thread, and return the
1943    new thread.  This requires that Py_Initialize() has been called
1944    first.
1945 
1946    Unsuccessful initialization yields a NULL pointer.  Note that *no*
1947    exception information is available even in this case -- the
1948    exception information is held in the thread, and there is no
1949    thread.
1950 
1951    Locking: as above.
1952 
1953 */
1954 
1955 static PyStatus
new_interpreter(PyThreadState ** tstate_p,int isolated_subinterpreter)1956 new_interpreter(PyThreadState **tstate_p, int isolated_subinterpreter)
1957 {
1958     PyStatus status;
1959 
1960     status = _PyRuntime_Initialize();
1961     if (_PyStatus_EXCEPTION(status)) {
1962         return status;
1963     }
1964     _PyRuntimeState *runtime = &_PyRuntime;
1965 
1966     if (!runtime->initialized) {
1967         return _PyStatus_ERR("Py_Initialize must be called first");
1968     }
1969 
1970     /* Issue #10915, #15751: The GIL API doesn't work with multiple
1971        interpreters: disable PyGILState_Check(). */
1972     runtime->gilstate.check_enabled = 0;
1973 
1974     PyInterpreterState *interp = PyInterpreterState_New();
1975     if (interp == NULL) {
1976         *tstate_p = NULL;
1977         return _PyStatus_OK();
1978     }
1979 
1980     PyThreadState *tstate = PyThreadState_New(interp);
1981     if (tstate == NULL) {
1982         PyInterpreterState_Delete(interp);
1983         *tstate_p = NULL;
1984         return _PyStatus_OK();
1985     }
1986 
1987     PyThreadState *save_tstate = PyThreadState_Swap(tstate);
1988 
1989     /* Copy the current interpreter config into the new interpreter */
1990     const PyConfig *config;
1991     if (save_tstate != NULL) {
1992         config = _PyInterpreterState_GetConfig(save_tstate->interp);
1993     }
1994     else
1995     {
1996         /* No current thread state, copy from the main interpreter */
1997         PyInterpreterState *main_interp = _PyInterpreterState_Main();
1998         config = _PyInterpreterState_GetConfig(main_interp);
1999     }
2000 
2001 
2002     status = _PyConfig_Copy(&interp->config, config);
2003     if (_PyStatus_EXCEPTION(status)) {
2004         goto error;
2005     }
2006     interp->config._isolated_interpreter = isolated_subinterpreter;
2007 
2008     status = init_interp_create_gil(tstate);
2009     if (_PyStatus_EXCEPTION(status)) {
2010         goto error;
2011     }
2012 
2013     status = pycore_interp_init(tstate);
2014     if (_PyStatus_EXCEPTION(status)) {
2015         goto error;
2016     }
2017 
2018     status = init_interp_main(tstate);
2019     if (_PyStatus_EXCEPTION(status)) {
2020         goto error;
2021     }
2022 
2023     *tstate_p = tstate;
2024     return _PyStatus_OK();
2025 
2026 error:
2027     *tstate_p = NULL;
2028 
2029     /* Oops, it didn't work.  Undo it all. */
2030     PyErr_PrintEx(0);
2031     PyThreadState_Swap(save_tstate);
2032     PyThreadState_Clear(tstate);
2033     PyThreadState_Delete(tstate);
2034     PyInterpreterState_Delete(interp);
2035 
2036     return status;
2037 }
2038 
2039 PyThreadState *
_Py_NewInterpreter(int isolated_subinterpreter)2040 _Py_NewInterpreter(int isolated_subinterpreter)
2041 {
2042     PyThreadState *tstate = NULL;
2043     PyStatus status = new_interpreter(&tstate, isolated_subinterpreter);
2044     if (_PyStatus_EXCEPTION(status)) {
2045         Py_ExitStatusException(status);
2046     }
2047     return tstate;
2048 
2049 }
2050 
2051 PyThreadState *
Py_NewInterpreter(void)2052 Py_NewInterpreter(void)
2053 {
2054     return _Py_NewInterpreter(0);
2055 }
2056 
2057 /* Delete an interpreter and its last thread.  This requires that the
2058    given thread state is current, that the thread has no remaining
2059    frames, and that it is its interpreter's only remaining thread.
2060    It is a fatal error to violate these constraints.
2061 
2062    (Py_FinalizeEx() doesn't have these constraints -- it zaps
2063    everything, regardless.)
2064 
2065    Locking: as above.
2066 
2067 */
2068 
2069 void
Py_EndInterpreter(PyThreadState * tstate)2070 Py_EndInterpreter(PyThreadState *tstate)
2071 {
2072     PyInterpreterState *interp = tstate->interp;
2073 
2074     if (tstate != _PyThreadState_GET()) {
2075         Py_FatalError("thread is not current");
2076     }
2077     if (tstate->cframe->current_frame != NULL) {
2078         Py_FatalError("thread still has a frame");
2079     }
2080     interp->finalizing = 1;
2081 
2082     // Wrap up existing "threading"-module-created, non-daemon threads.
2083     wait_for_thread_shutdown(tstate);
2084 
2085     _PyAtExit_Call(tstate->interp);
2086 
2087     if (tstate != interp->threads.head || tstate->next != NULL) {
2088         Py_FatalError("not the last thread");
2089     }
2090 
2091     finalize_modules(tstate);
2092 
2093     finalize_interp_clear(tstate);
2094     finalize_interp_delete(tstate->interp);
2095 }
2096 
2097 /* Add the __main__ module */
2098 
2099 static PyStatus
add_main_module(PyInterpreterState * interp)2100 add_main_module(PyInterpreterState *interp)
2101 {
2102     PyObject *m, *d, *loader, *ann_dict;
2103     m = PyImport_AddModule("__main__");
2104     if (m == NULL)
2105         return _PyStatus_ERR("can't create __main__ module");
2106 
2107     d = PyModule_GetDict(m);
2108     ann_dict = PyDict_New();
2109     if ((ann_dict == NULL) ||
2110         (PyDict_SetItemString(d, "__annotations__", ann_dict) < 0)) {
2111         return _PyStatus_ERR("Failed to initialize __main__.__annotations__");
2112     }
2113     Py_DECREF(ann_dict);
2114 
2115     if (_PyDict_GetItemStringWithError(d, "__builtins__") == NULL) {
2116         if (PyErr_Occurred()) {
2117             return _PyStatus_ERR("Failed to test __main__.__builtins__");
2118         }
2119         PyObject *bimod = PyImport_ImportModule("builtins");
2120         if (bimod == NULL) {
2121             return _PyStatus_ERR("Failed to retrieve builtins module");
2122         }
2123         if (PyDict_SetItemString(d, "__builtins__", bimod) < 0) {
2124             return _PyStatus_ERR("Failed to initialize __main__.__builtins__");
2125         }
2126         Py_DECREF(bimod);
2127     }
2128 
2129     /* Main is a little special - imp.is_builtin("__main__") will return
2130      * False, but BuiltinImporter is still the most appropriate initial
2131      * setting for its __loader__ attribute. A more suitable value will
2132      * be set if __main__ gets further initialized later in the startup
2133      * process.
2134      */
2135     loader = _PyDict_GetItemStringWithError(d, "__loader__");
2136     if (loader == NULL || loader == Py_None) {
2137         if (PyErr_Occurred()) {
2138             return _PyStatus_ERR("Failed to test __main__.__loader__");
2139         }
2140         PyObject *loader = PyObject_GetAttrString(interp->importlib,
2141                                                   "BuiltinImporter");
2142         if (loader == NULL) {
2143             return _PyStatus_ERR("Failed to retrieve BuiltinImporter");
2144         }
2145         if (PyDict_SetItemString(d, "__loader__", loader) < 0) {
2146             return _PyStatus_ERR("Failed to initialize __main__.__loader__");
2147         }
2148         Py_DECREF(loader);
2149     }
2150     return _PyStatus_OK();
2151 }
2152 
2153 /* Import the site module (not into __main__ though) */
2154 
2155 static PyStatus
init_import_site(void)2156 init_import_site(void)
2157 {
2158     PyObject *m;
2159     m = PyImport_ImportModule("site");
2160     if (m == NULL) {
2161         return _PyStatus_ERR("Failed to import the site module");
2162     }
2163     Py_DECREF(m);
2164     return _PyStatus_OK();
2165 }
2166 
2167 /* Check if a file descriptor is valid or not.
2168    Return 0 if the file descriptor is invalid, return non-zero otherwise. */
2169 static int
is_valid_fd(int fd)2170 is_valid_fd(int fd)
2171 {
2172 /* dup() is faster than fstat(): fstat() can require input/output operations,
2173    whereas dup() doesn't. There is a low risk of EMFILE/ENFILE at Python
2174    startup. Problem: dup() doesn't check if the file descriptor is valid on
2175    some platforms.
2176 
2177    fcntl(fd, F_GETFD) is even faster, because it only checks the process table.
2178    It is preferred over dup() when available, since it cannot fail with the
2179    "too many open files" error (EMFILE).
2180 
2181    bpo-30225: On macOS Tiger, when stdout is redirected to a pipe and the other
2182    side of the pipe is closed, dup(1) succeed, whereas fstat(1, &st) fails with
2183    EBADF. FreeBSD has similar issue (bpo-32849).
2184 
2185    Only use dup() on Linux where dup() is enough to detect invalid FD
2186    (bpo-32849).
2187 */
2188     if (fd < 0) {
2189         return 0;
2190     }
2191 #if defined(F_GETFD) && ( \
2192         defined(__linux__) || \
2193         defined(__APPLE__) || \
2194         defined(__wasm__))
2195     return fcntl(fd, F_GETFD) >= 0;
2196 #elif defined(__linux__)
2197     int fd2 = dup(fd);
2198     if (fd2 >= 0) {
2199         close(fd2);
2200     }
2201     return (fd2 >= 0);
2202 #elif defined(MS_WINDOWS)
2203     HANDLE hfile;
2204     _Py_BEGIN_SUPPRESS_IPH
2205     hfile = (HANDLE)_get_osfhandle(fd);
2206     _Py_END_SUPPRESS_IPH
2207     return (hfile != INVALID_HANDLE_VALUE
2208             && GetFileType(hfile) != FILE_TYPE_UNKNOWN);
2209 #else
2210     struct stat st;
2211     return (fstat(fd, &st) == 0);
2212 #endif
2213 }
2214 
2215 /* returns Py_None if the fd is not valid */
2216 static PyObject*
create_stdio(const PyConfig * config,PyObject * io,int fd,int write_mode,const char * name,const wchar_t * encoding,const wchar_t * errors)2217 create_stdio(const PyConfig *config, PyObject* io,
2218     int fd, int write_mode, const char* name,
2219     const wchar_t* encoding, const wchar_t* errors)
2220 {
2221     PyObject *buf = NULL, *stream = NULL, *text = NULL, *raw = NULL, *res;
2222     const char* mode;
2223     const char* newline;
2224     PyObject *line_buffering, *write_through;
2225     int buffering, isatty;
2226     const int buffered_stdio = config->buffered_stdio;
2227 
2228     if (!is_valid_fd(fd))
2229         Py_RETURN_NONE;
2230 
2231     /* stdin is always opened in buffered mode, first because it shouldn't
2232        make a difference in common use cases, second because TextIOWrapper
2233        depends on the presence of a read1() method which only exists on
2234        buffered streams.
2235     */
2236     if (!buffered_stdio && write_mode)
2237         buffering = 0;
2238     else
2239         buffering = -1;
2240     if (write_mode)
2241         mode = "wb";
2242     else
2243         mode = "rb";
2244     buf = _PyObject_CallMethod(io, &_Py_ID(open), "isiOOOO",
2245                                fd, mode, buffering,
2246                                Py_None, Py_None, /* encoding, errors */
2247                                Py_None, Py_False); /* newline, closefd */
2248     if (buf == NULL)
2249         goto error;
2250 
2251     if (buffering) {
2252         raw = PyObject_GetAttr(buf, &_Py_ID(raw));
2253         if (raw == NULL)
2254             goto error;
2255     }
2256     else {
2257         raw = buf;
2258         Py_INCREF(raw);
2259     }
2260 
2261 #ifdef MS_WINDOWS
2262     /* Windows console IO is always UTF-8 encoded */
2263     if (PyWindowsConsoleIO_Check(raw))
2264         encoding = L"utf-8";
2265 #endif
2266 
2267     text = PyUnicode_FromString(name);
2268     if (text == NULL || PyObject_SetAttr(raw, &_Py_ID(name), text) < 0)
2269         goto error;
2270     res = PyObject_CallMethodNoArgs(raw, &_Py_ID(isatty));
2271     if (res == NULL)
2272         goto error;
2273     isatty = PyObject_IsTrue(res);
2274     Py_DECREF(res);
2275     if (isatty == -1)
2276         goto error;
2277     if (!buffered_stdio)
2278         write_through = Py_True;
2279     else
2280         write_through = Py_False;
2281     if (buffered_stdio && (isatty || fd == fileno(stderr)))
2282         line_buffering = Py_True;
2283     else
2284         line_buffering = Py_False;
2285 
2286     Py_CLEAR(raw);
2287     Py_CLEAR(text);
2288 
2289 #ifdef MS_WINDOWS
2290     /* sys.stdin: enable universal newline mode, translate "\r\n" and "\r"
2291        newlines to "\n".
2292        sys.stdout and sys.stderr: translate "\n" to "\r\n". */
2293     newline = NULL;
2294 #else
2295     /* sys.stdin: split lines at "\n".
2296        sys.stdout and sys.stderr: don't translate newlines (use "\n"). */
2297     newline = "\n";
2298 #endif
2299 
2300     PyObject *encoding_str = PyUnicode_FromWideChar(encoding, -1);
2301     if (encoding_str == NULL) {
2302         Py_CLEAR(buf);
2303         goto error;
2304     }
2305 
2306     PyObject *errors_str = PyUnicode_FromWideChar(errors, -1);
2307     if (errors_str == NULL) {
2308         Py_CLEAR(buf);
2309         Py_CLEAR(encoding_str);
2310         goto error;
2311     }
2312 
2313     stream = _PyObject_CallMethod(io, &_Py_ID(TextIOWrapper), "OOOsOO",
2314                                   buf, encoding_str, errors_str,
2315                                   newline, line_buffering, write_through);
2316     Py_CLEAR(buf);
2317     Py_CLEAR(encoding_str);
2318     Py_CLEAR(errors_str);
2319     if (stream == NULL)
2320         goto error;
2321 
2322     if (write_mode)
2323         mode = "w";
2324     else
2325         mode = "r";
2326     text = PyUnicode_FromString(mode);
2327     if (!text || PyObject_SetAttr(stream, &_Py_ID(mode), text) < 0)
2328         goto error;
2329     Py_CLEAR(text);
2330     return stream;
2331 
2332 error:
2333     Py_XDECREF(buf);
2334     Py_XDECREF(stream);
2335     Py_XDECREF(text);
2336     Py_XDECREF(raw);
2337 
2338     if (PyErr_ExceptionMatches(PyExc_OSError) && !is_valid_fd(fd)) {
2339         /* Issue #24891: the file descriptor was closed after the first
2340            is_valid_fd() check was called. Ignore the OSError and set the
2341            stream to None. */
2342         PyErr_Clear();
2343         Py_RETURN_NONE;
2344     }
2345     return NULL;
2346 }
2347 
2348 /* Set builtins.open to io.open */
2349 static PyStatus
init_set_builtins_open(void)2350 init_set_builtins_open(void)
2351 {
2352     PyObject *iomod = NULL, *wrapper;
2353     PyObject *bimod = NULL;
2354     PyStatus res = _PyStatus_OK();
2355 
2356     if (!(iomod = PyImport_ImportModule("io"))) {
2357         goto error;
2358     }
2359 
2360     if (!(bimod = PyImport_ImportModule("builtins"))) {
2361         goto error;
2362     }
2363 
2364     if (!(wrapper = PyObject_GetAttrString(iomod, "open"))) {
2365         goto error;
2366     }
2367 
2368     /* Set builtins.open */
2369     if (PyObject_SetAttrString(bimod, "open", wrapper) == -1) {
2370         Py_DECREF(wrapper);
2371         goto error;
2372     }
2373     Py_DECREF(wrapper);
2374     goto done;
2375 
2376 error:
2377     res = _PyStatus_ERR("can't initialize io.open");
2378 
2379 done:
2380     Py_XDECREF(bimod);
2381     Py_XDECREF(iomod);
2382     return res;
2383 }
2384 
2385 
2386 /* Create sys.stdin, sys.stdout and sys.stderr */
2387 static PyStatus
init_sys_streams(PyThreadState * tstate)2388 init_sys_streams(PyThreadState *tstate)
2389 {
2390     PyObject *iomod = NULL;
2391     PyObject *std = NULL;
2392     int fd;
2393     PyObject * encoding_attr;
2394     PyStatus res = _PyStatus_OK();
2395     const PyConfig *config = _PyInterpreterState_GetConfig(tstate->interp);
2396 
2397     /* Check that stdin is not a directory
2398        Using shell redirection, you can redirect stdin to a directory,
2399        crashing the Python interpreter. Catch this common mistake here
2400        and output a useful error message. Note that under MS Windows,
2401        the shell already prevents that. */
2402 #ifndef MS_WINDOWS
2403     struct _Py_stat_struct sb;
2404     if (_Py_fstat_noraise(fileno(stdin), &sb) == 0 &&
2405         S_ISDIR(sb.st_mode)) {
2406         return _PyStatus_ERR("<stdin> is a directory, cannot continue");
2407     }
2408 #endif
2409 
2410     if (!(iomod = PyImport_ImportModule("io"))) {
2411         goto error;
2412     }
2413 
2414     /* Set sys.stdin */
2415     fd = fileno(stdin);
2416     /* Under some conditions stdin, stdout and stderr may not be connected
2417      * and fileno() may point to an invalid file descriptor. For example
2418      * GUI apps don't have valid standard streams by default.
2419      */
2420     std = create_stdio(config, iomod, fd, 0, "<stdin>",
2421                        config->stdio_encoding,
2422                        config->stdio_errors);
2423     if (std == NULL)
2424         goto error;
2425     PySys_SetObject("__stdin__", std);
2426     _PySys_SetAttr(&_Py_ID(stdin), std);
2427     Py_DECREF(std);
2428 
2429     /* Set sys.stdout */
2430     fd = fileno(stdout);
2431     std = create_stdio(config, iomod, fd, 1, "<stdout>",
2432                        config->stdio_encoding,
2433                        config->stdio_errors);
2434     if (std == NULL)
2435         goto error;
2436     PySys_SetObject("__stdout__", std);
2437     _PySys_SetAttr(&_Py_ID(stdout), std);
2438     Py_DECREF(std);
2439 
2440 #if 1 /* Disable this if you have trouble debugging bootstrap stuff */
2441     /* Set sys.stderr, replaces the preliminary stderr */
2442     fd = fileno(stderr);
2443     std = create_stdio(config, iomod, fd, 1, "<stderr>",
2444                        config->stdio_encoding,
2445                        L"backslashreplace");
2446     if (std == NULL)
2447         goto error;
2448 
2449     /* Same as hack above, pre-import stderr's codec to avoid recursion
2450        when import.c tries to write to stderr in verbose mode. */
2451     encoding_attr = PyObject_GetAttrString(std, "encoding");
2452     if (encoding_attr != NULL) {
2453         const char *std_encoding = PyUnicode_AsUTF8(encoding_attr);
2454         if (std_encoding != NULL) {
2455             PyObject *codec_info = _PyCodec_Lookup(std_encoding);
2456             Py_XDECREF(codec_info);
2457         }
2458         Py_DECREF(encoding_attr);
2459     }
2460     _PyErr_Clear(tstate);  /* Not a fatal error if codec isn't available */
2461 
2462     if (PySys_SetObject("__stderr__", std) < 0) {
2463         Py_DECREF(std);
2464         goto error;
2465     }
2466     if (_PySys_SetAttr(&_Py_ID(stderr), std) < 0) {
2467         Py_DECREF(std);
2468         goto error;
2469     }
2470     Py_DECREF(std);
2471 #endif
2472 
2473     goto done;
2474 
2475 error:
2476     res = _PyStatus_ERR("can't initialize sys standard streams");
2477 
2478 done:
2479     _Py_ClearStandardStreamEncoding();
2480     Py_XDECREF(iomod);
2481     return res;
2482 }
2483 
2484 
2485 static void
_Py_FatalError_DumpTracebacks(int fd,PyInterpreterState * interp,PyThreadState * tstate)2486 _Py_FatalError_DumpTracebacks(int fd, PyInterpreterState *interp,
2487                               PyThreadState *tstate)
2488 {
2489     PUTS(fd, "\n");
2490 
2491     /* display the current Python stack */
2492     _Py_DumpTracebackThreads(fd, interp, tstate);
2493 }
2494 
2495 /* Print the current exception (if an exception is set) with its traceback,
2496    or display the current Python stack.
2497 
2498    Don't call PyErr_PrintEx() and the except hook, because Py_FatalError() is
2499    called on catastrophic cases.
2500 
2501    Return 1 if the traceback was displayed, 0 otherwise. */
2502 
2503 static int
_Py_FatalError_PrintExc(PyThreadState * tstate)2504 _Py_FatalError_PrintExc(PyThreadState *tstate)
2505 {
2506     PyObject *ferr, *res;
2507     PyObject *exception, *v, *tb;
2508     int has_tb;
2509 
2510     _PyErr_Fetch(tstate, &exception, &v, &tb);
2511     if (exception == NULL) {
2512         /* No current exception */
2513         return 0;
2514     }
2515 
2516     ferr = _PySys_GetAttr(tstate, &_Py_ID(stderr));
2517     if (ferr == NULL || ferr == Py_None) {
2518         /* sys.stderr is not set yet or set to None,
2519            no need to try to display the exception */
2520         return 0;
2521     }
2522 
2523     _PyErr_NormalizeException(tstate, &exception, &v, &tb);
2524     if (tb == NULL) {
2525         tb = Py_None;
2526         Py_INCREF(tb);
2527     }
2528     PyException_SetTraceback(v, tb);
2529     if (exception == NULL) {
2530         /* PyErr_NormalizeException() failed */
2531         return 0;
2532     }
2533 
2534     has_tb = (tb != Py_None);
2535     PyErr_Display(exception, v, tb);
2536     Py_XDECREF(exception);
2537     Py_XDECREF(v);
2538     Py_XDECREF(tb);
2539 
2540     /* sys.stderr may be buffered: call sys.stderr.flush() */
2541     res = PyObject_CallMethodNoArgs(ferr, &_Py_ID(flush));
2542     if (res == NULL) {
2543         _PyErr_Clear(tstate);
2544     }
2545     else {
2546         Py_DECREF(res);
2547     }
2548 
2549     return has_tb;
2550 }
2551 
2552 /* Print fatal error message and abort */
2553 
2554 #ifdef MS_WINDOWS
2555 static void
fatal_output_debug(const char * msg)2556 fatal_output_debug(const char *msg)
2557 {
2558     /* buffer of 256 bytes allocated on the stack */
2559     WCHAR buffer[256 / sizeof(WCHAR)];
2560     size_t buflen = Py_ARRAY_LENGTH(buffer) - 1;
2561     size_t msglen;
2562 
2563     OutputDebugStringW(L"Fatal Python error: ");
2564 
2565     msglen = strlen(msg);
2566     while (msglen) {
2567         size_t i;
2568 
2569         if (buflen > msglen) {
2570             buflen = msglen;
2571         }
2572 
2573         /* Convert the message to wchar_t. This uses a simple one-to-one
2574            conversion, assuming that the this error message actually uses
2575            ASCII only. If this ceases to be true, we will have to convert. */
2576         for (i=0; i < buflen; ++i) {
2577             buffer[i] = msg[i];
2578         }
2579         buffer[i] = L'\0';
2580         OutputDebugStringW(buffer);
2581 
2582         msg += buflen;
2583         msglen -= buflen;
2584     }
2585     OutputDebugStringW(L"\n");
2586 }
2587 #endif
2588 
2589 
2590 static void
fatal_error_dump_runtime(int fd,_PyRuntimeState * runtime)2591 fatal_error_dump_runtime(int fd, _PyRuntimeState *runtime)
2592 {
2593     PUTS(fd, "Python runtime state: ");
2594     PyThreadState *finalizing = _PyRuntimeState_GetFinalizing(runtime);
2595     if (finalizing) {
2596         PUTS(fd, "finalizing (tstate=0x");
2597         _Py_DumpHexadecimal(fd, (uintptr_t)finalizing, sizeof(finalizing) * 2);
2598         PUTS(fd, ")");
2599     }
2600     else if (runtime->initialized) {
2601         PUTS(fd, "initialized");
2602     }
2603     else if (runtime->core_initialized) {
2604         PUTS(fd, "core initialized");
2605     }
2606     else if (runtime->preinitialized) {
2607         PUTS(fd, "preinitialized");
2608     }
2609     else if (runtime->preinitializing) {
2610         PUTS(fd, "preinitializing");
2611     }
2612     else {
2613         PUTS(fd, "unknown");
2614     }
2615     PUTS(fd, "\n");
2616 }
2617 
2618 
2619 static inline void _Py_NO_RETURN
fatal_error_exit(int status)2620 fatal_error_exit(int status)
2621 {
2622     if (status < 0) {
2623 #if defined(MS_WINDOWS) && defined(_DEBUG)
2624         DebugBreak();
2625 #endif
2626         abort();
2627     }
2628     else {
2629         exit(status);
2630     }
2631 }
2632 
2633 
2634 // Dump the list of extension modules of sys.modules, excluding stdlib modules
2635 // (sys.stdlib_module_names), into fd file descriptor.
2636 //
2637 // This function is called by a signal handler in faulthandler: avoid memory
2638 // allocations and keep the implementation simple. For example, the list is not
2639 // sorted on purpose.
2640 void
_Py_DumpExtensionModules(int fd,PyInterpreterState * interp)2641 _Py_DumpExtensionModules(int fd, PyInterpreterState *interp)
2642 {
2643     if (interp == NULL) {
2644         return;
2645     }
2646     PyObject *modules = interp->modules;
2647     if (modules == NULL || !PyDict_Check(modules)) {
2648         return;
2649     }
2650 
2651     Py_ssize_t pos;
2652     PyObject *key, *value;
2653 
2654     // Avoid PyDict_GetItemString() which calls PyUnicode_FromString(),
2655     // memory cannot be allocated on the heap in a signal handler.
2656     // Iterate on the dict instead.
2657     PyObject *stdlib_module_names = NULL;
2658     if (interp->sysdict != NULL) {
2659         pos = 0;
2660         while (PyDict_Next(interp->sysdict, &pos, &key, &value)) {
2661             if (PyUnicode_Check(key)
2662                && PyUnicode_CompareWithASCIIString(key, "stdlib_module_names") == 0) {
2663                 stdlib_module_names = value;
2664                 break;
2665             }
2666         }
2667     }
2668     // If we failed to get sys.stdlib_module_names or it's not a frozenset,
2669     // don't exclude stdlib modules.
2670     if (stdlib_module_names != NULL && !PyFrozenSet_Check(stdlib_module_names)) {
2671         stdlib_module_names = NULL;
2672     }
2673 
2674     // List extensions
2675     int header = 1;
2676     Py_ssize_t count = 0;
2677     pos = 0;
2678     while (PyDict_Next(modules, &pos, &key, &value)) {
2679         if (!PyUnicode_Check(key)) {
2680             continue;
2681         }
2682         if (!_PyModule_IsExtension(value)) {
2683             continue;
2684         }
2685         // Use the module name from the sys.modules key,
2686         // don't attempt to get the module object name.
2687         if (stdlib_module_names != NULL) {
2688             int is_stdlib_ext = 0;
2689 
2690             Py_ssize_t i = 0;
2691             PyObject *item;
2692             Py_hash_t hash;
2693             while (_PySet_NextEntry(stdlib_module_names, &i, &item, &hash)) {
2694                 if (PyUnicode_Check(item)
2695                     && PyUnicode_Compare(key, item) == 0)
2696                 {
2697                     is_stdlib_ext = 1;
2698                     break;
2699                 }
2700             }
2701             if (is_stdlib_ext) {
2702                 // Ignore stdlib extension
2703                 continue;
2704             }
2705         }
2706 
2707         if (header) {
2708             PUTS(fd, "\nExtension modules: ");
2709             header = 0;
2710         }
2711         else {
2712             PUTS(fd, ", ");
2713         }
2714 
2715         _Py_DumpASCII(fd, key);
2716         count++;
2717     }
2718 
2719     if (count) {
2720         PUTS(fd, " (total: ");
2721         _Py_DumpDecimal(fd, count);
2722         PUTS(fd, ")");
2723         PUTS(fd, "\n");
2724     }
2725 }
2726 
2727 
2728 static void _Py_NO_RETURN
fatal_error(int fd,int header,const char * prefix,const char * msg,int status)2729 fatal_error(int fd, int header, const char *prefix, const char *msg,
2730             int status)
2731 {
2732     static int reentrant = 0;
2733 
2734     if (reentrant) {
2735         /* Py_FatalError() caused a second fatal error.
2736            Example: flush_std_files() raises a recursion error. */
2737         fatal_error_exit(status);
2738     }
2739     reentrant = 1;
2740 
2741     if (header) {
2742         PUTS(fd, "Fatal Python error: ");
2743         if (prefix) {
2744             PUTS(fd, prefix);
2745             PUTS(fd, ": ");
2746         }
2747         if (msg) {
2748             PUTS(fd, msg);
2749         }
2750         else {
2751             PUTS(fd, "<message not set>");
2752         }
2753         PUTS(fd, "\n");
2754     }
2755 
2756     _PyRuntimeState *runtime = &_PyRuntime;
2757     fatal_error_dump_runtime(fd, runtime);
2758 
2759     /* Check if the current thread has a Python thread state
2760        and holds the GIL.
2761 
2762        tss_tstate is NULL if Py_FatalError() is called from a C thread which
2763        has no Python thread state.
2764 
2765        tss_tstate != tstate if the current Python thread does not hold the GIL.
2766        */
2767     PyThreadState *tstate = _PyRuntimeState_GetThreadState(runtime);
2768     PyInterpreterState *interp = NULL;
2769     PyThreadState *tss_tstate = PyGILState_GetThisThreadState();
2770     if (tstate != NULL) {
2771         interp = tstate->interp;
2772     }
2773     else if (tss_tstate != NULL) {
2774         interp = tss_tstate->interp;
2775     }
2776     int has_tstate_and_gil = (tss_tstate != NULL && tss_tstate == tstate);
2777 
2778     if (has_tstate_and_gil) {
2779         /* If an exception is set, print the exception with its traceback */
2780         if (!_Py_FatalError_PrintExc(tss_tstate)) {
2781             /* No exception is set, or an exception is set without traceback */
2782             _Py_FatalError_DumpTracebacks(fd, interp, tss_tstate);
2783         }
2784     }
2785     else {
2786         _Py_FatalError_DumpTracebacks(fd, interp, tss_tstate);
2787     }
2788 
2789     _Py_DumpExtensionModules(fd, interp);
2790 
2791     /* The main purpose of faulthandler is to display the traceback.
2792        This function already did its best to display a traceback.
2793        Disable faulthandler to prevent writing a second traceback
2794        on abort(). */
2795     _PyFaulthandler_Fini();
2796 
2797     /* Check if the current Python thread hold the GIL */
2798     if (has_tstate_and_gil) {
2799         /* Flush sys.stdout and sys.stderr */
2800         flush_std_files();
2801     }
2802 
2803 #ifdef MS_WINDOWS
2804     fatal_output_debug(msg);
2805 #endif /* MS_WINDOWS */
2806 
2807     fatal_error_exit(status);
2808 }
2809 
2810 
2811 #undef Py_FatalError
2812 
2813 void _Py_NO_RETURN
Py_FatalError(const char * msg)2814 Py_FatalError(const char *msg)
2815 {
2816     fatal_error(fileno(stderr), 1, NULL, msg, -1);
2817 }
2818 
2819 
2820 void _Py_NO_RETURN
_Py_FatalErrorFunc(const char * func,const char * msg)2821 _Py_FatalErrorFunc(const char *func, const char *msg)
2822 {
2823     fatal_error(fileno(stderr), 1, func, msg, -1);
2824 }
2825 
2826 
2827 void _Py_NO_RETURN
_Py_FatalErrorFormat(const char * func,const char * format,...)2828 _Py_FatalErrorFormat(const char *func, const char *format, ...)
2829 {
2830     static int reentrant = 0;
2831     if (reentrant) {
2832         /* _Py_FatalErrorFormat() caused a second fatal error */
2833         fatal_error_exit(-1);
2834     }
2835     reentrant = 1;
2836 
2837     FILE *stream = stderr;
2838     const int fd = fileno(stream);
2839     PUTS(fd, "Fatal Python error: ");
2840     if (func) {
2841         PUTS(fd, func);
2842         PUTS(fd, ": ");
2843     }
2844 
2845     va_list vargs;
2846 #ifdef HAVE_STDARG_PROTOTYPES
2847     va_start(vargs, format);
2848 #else
2849     va_start(vargs);
2850 #endif
2851     vfprintf(stream, format, vargs);
2852     va_end(vargs);
2853 
2854     fputs("\n", stream);
2855     fflush(stream);
2856 
2857     fatal_error(fd, 0, NULL, NULL, -1);
2858 }
2859 
2860 
2861 void _Py_NO_RETURN
_Py_FatalRefcountErrorFunc(const char * func,const char * msg)2862 _Py_FatalRefcountErrorFunc(const char *func, const char *msg)
2863 {
2864     _Py_FatalErrorFormat(func,
2865                          "%s: bug likely caused by a refcount error "
2866                          "in a C extension",
2867                          msg);
2868 }
2869 
2870 
2871 void _Py_NO_RETURN
Py_ExitStatusException(PyStatus status)2872 Py_ExitStatusException(PyStatus status)
2873 {
2874     if (_PyStatus_IS_EXIT(status)) {
2875         exit(status.exitcode);
2876     }
2877     else if (_PyStatus_IS_ERROR(status)) {
2878         fatal_error(fileno(stderr), 1, status.func, status.err_msg, 1);
2879     }
2880     else {
2881         Py_FatalError("Py_ExitStatusException() must not be called on success");
2882     }
2883 }
2884 
2885 
2886 /* Wait until threading._shutdown completes, provided
2887    the threading module was imported in the first place.
2888    The shutdown routine will wait until all non-daemon
2889    "threading" threads have completed. */
2890 static void
wait_for_thread_shutdown(PyThreadState * tstate)2891 wait_for_thread_shutdown(PyThreadState *tstate)
2892 {
2893     PyObject *result;
2894     PyObject *threading = PyImport_GetModule(&_Py_ID(threading));
2895     if (threading == NULL) {
2896         if (_PyErr_Occurred(tstate)) {
2897             PyErr_WriteUnraisable(NULL);
2898         }
2899         /* else: threading not imported */
2900         return;
2901     }
2902     result = PyObject_CallMethodNoArgs(threading, &_Py_ID(_shutdown));
2903     if (result == NULL) {
2904         PyErr_WriteUnraisable(threading);
2905     }
2906     else {
2907         Py_DECREF(result);
2908     }
2909     Py_DECREF(threading);
2910 }
2911 
2912 #define NEXITFUNCS 32
Py_AtExit(void (* func)(void))2913 int Py_AtExit(void (*func)(void))
2914 {
2915     if (_PyRuntime.nexitfuncs >= NEXITFUNCS)
2916         return -1;
2917     _PyRuntime.exitfuncs[_PyRuntime.nexitfuncs++] = func;
2918     return 0;
2919 }
2920 
2921 static void
call_ll_exitfuncs(_PyRuntimeState * runtime)2922 call_ll_exitfuncs(_PyRuntimeState *runtime)
2923 {
2924     while (runtime->nexitfuncs > 0) {
2925         /* pop last function from the list */
2926         runtime->nexitfuncs--;
2927         void (*exitfunc)(void) = runtime->exitfuncs[runtime->nexitfuncs];
2928         runtime->exitfuncs[runtime->nexitfuncs] = NULL;
2929 
2930         exitfunc();
2931     }
2932 
2933     fflush(stdout);
2934     fflush(stderr);
2935 }
2936 
2937 void _Py_NO_RETURN
Py_Exit(int sts)2938 Py_Exit(int sts)
2939 {
2940     if (Py_FinalizeEx() < 0) {
2941         sts = 120;
2942     }
2943 
2944     exit(sts);
2945 }
2946 
2947 
2948 /*
2949  * The file descriptor fd is considered ``interactive'' if either
2950  *   a) isatty(fd) is TRUE, or
2951  *   b) the -i flag was given, and the filename associated with
2952  *      the descriptor is NULL or "<stdin>" or "???".
2953  */
2954 int
Py_FdIsInteractive(FILE * fp,const char * filename)2955 Py_FdIsInteractive(FILE *fp, const char *filename)
2956 {
2957     if (isatty((int)fileno(fp)))
2958         return 1;
2959     if (!Py_InteractiveFlag)
2960         return 0;
2961     return (filename == NULL) ||
2962            (strcmp(filename, "<stdin>") == 0) ||
2963            (strcmp(filename, "???") == 0);
2964 }
2965 
2966 
2967 int
_Py_FdIsInteractive(FILE * fp,PyObject * filename)2968 _Py_FdIsInteractive(FILE *fp, PyObject *filename)
2969 {
2970     if (isatty((int)fileno(fp))) {
2971         return 1;
2972     }
2973     if (!Py_InteractiveFlag) {
2974         return 0;
2975     }
2976     return (filename == NULL) ||
2977            (PyUnicode_CompareWithASCIIString(filename, "<stdin>") == 0) ||
2978            (PyUnicode_CompareWithASCIIString(filename, "???") == 0);
2979 }
2980 
2981 
2982 /* Wrappers around sigaction() or signal(). */
2983 
2984 PyOS_sighandler_t
PyOS_getsig(int sig)2985 PyOS_getsig(int sig)
2986 {
2987 #ifdef HAVE_SIGACTION
2988     struct sigaction context;
2989     if (sigaction(sig, NULL, &context) == -1)
2990         return SIG_ERR;
2991     return context.sa_handler;
2992 #else
2993     PyOS_sighandler_t handler;
2994 /* Special signal handling for the secure CRT in Visual Studio 2005 */
2995 #if defined(_MSC_VER) && _MSC_VER >= 1400
2996     switch (sig) {
2997     /* Only these signals are valid */
2998     case SIGINT:
2999     case SIGILL:
3000     case SIGFPE:
3001     case SIGSEGV:
3002     case SIGTERM:
3003     case SIGBREAK:
3004     case SIGABRT:
3005         break;
3006     /* Don't call signal() with other values or it will assert */
3007     default:
3008         return SIG_ERR;
3009     }
3010 #endif /* _MSC_VER && _MSC_VER >= 1400 */
3011     handler = signal(sig, SIG_IGN);
3012     if (handler != SIG_ERR)
3013         signal(sig, handler);
3014     return handler;
3015 #endif
3016 }
3017 
3018 /*
3019  * All of the code in this function must only use async-signal-safe functions,
3020  * listed at `man 7 signal` or
3021  * http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
3022  */
3023 PyOS_sighandler_t
PyOS_setsig(int sig,PyOS_sighandler_t handler)3024 PyOS_setsig(int sig, PyOS_sighandler_t handler)
3025 {
3026 #ifdef HAVE_SIGACTION
3027     /* Some code in Modules/signalmodule.c depends on sigaction() being
3028      * used here if HAVE_SIGACTION is defined.  Fix that if this code
3029      * changes to invalidate that assumption.
3030      */
3031     struct sigaction context, ocontext;
3032     context.sa_handler = handler;
3033     sigemptyset(&context.sa_mask);
3034     /* Using SA_ONSTACK is friendlier to other C/C++/Golang-VM code that
3035      * extension module or embedding code may use where tiny thread stacks
3036      * are used.  https://bugs.python.org/issue43390 */
3037     context.sa_flags = SA_ONSTACK;
3038     if (sigaction(sig, &context, &ocontext) == -1)
3039         return SIG_ERR;
3040     return ocontext.sa_handler;
3041 #else
3042     PyOS_sighandler_t oldhandler;
3043     oldhandler = signal(sig, handler);
3044 #ifdef HAVE_SIGINTERRUPT
3045     siginterrupt(sig, 1);
3046 #endif
3047     return oldhandler;
3048 #endif
3049 }
3050 
3051 #ifdef __cplusplus
3052 }
3053 #endif
3054