diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 46579a45f4cc39..49041453f040bd 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -909,10 +909,12 @@ pycore_init_builtins(PyThreadState *tstate) interp->callable_cache.object__getattribute__ = object__getattribute__; if (_PyType_InitSlotDefs(interp) < 0) { + Py_DECREF(bimod); return _PyStatus_ERR("failed to init slotdefs"); } if (_PyBuiltins_AddExceptions(bimod) < 0) { + Py_DECREF(bimod); return _PyStatus_ERR("failed to add exceptions to builtins"); } @@ -920,12 +922,12 @@ pycore_init_builtins(PyThreadState *tstate) if (interp->builtins_copy == NULL) { goto error; } - Py_DECREF(bimod); if (_PyImport_InitDefaultImportFunc(interp) < 0) { goto error; } + Py_DECREF(bimod); assert(!_PyErr_Occurred(tstate)); return _PyStatus_OK(); @@ -1823,9 +1825,13 @@ finalize_clear_modules_dict(PyObject *modules) PyDict_Clear(modules); } else { - if (PyObject_CallMethodNoArgs(modules, &_Py_ID(clear)) == NULL) { + PyObject *result = PyObject_CallMethodNoArgs(modules, &_Py_ID(clear)); + if (result == NULL) { PyErr_FormatUnraisable("Exception ignored while clearing sys.modules"); } + else { + Py_DECREF(result); + } } } @@ -2702,14 +2708,14 @@ new_interpreter(PyThreadState **tstate_p, // didn't depend on interp->feature_flags being set already. status = _PyObject_InitState(interp); if (_PyStatus_EXCEPTION(status)) { - return status; + goto error; } #ifdef Py_STATS // initialize pystats. This must be done after the settings are loaded. status = _PyStats_InterpInit(interp); if (_PyStatus_EXCEPTION(status)) { - return status; + goto error; } #endif @@ -2929,6 +2935,7 @@ add_main_module(PyInterpreterState *interp) return _PyStatus_ERR("Failed to retrieve builtins module"); } if (PyDict_SetItemString(d, "__builtins__", bimod) < 0) { + Py_DECREF(bimod); return _PyStatus_ERR("Failed to initialize __main__.__builtins__"); } Py_DECREF(bimod); @@ -2952,6 +2959,7 @@ add_main_module(PyInterpreterState *interp) return _PyStatus_ERR("Failed to retrieve BuiltinImporter"); } if (PyDict_SetItemString(d, "__loader__", loader) < 0) { + Py_DECREF(loader); return _PyStatus_ERR("Failed to initialize __main__.__loader__"); } Py_DECREF(loader); @@ -3186,8 +3194,14 @@ init_sys_streams(PyThreadState *tstate) config->stdio_errors); if (std == NULL) goto error; - PySys_SetObject("__stdin__", std); - _PySys_SetAttr(&_Py_ID(stdin), std); + if (PySys_SetObject("__stdin__", std) < 0) { + Py_DECREF(std); + goto error; + } + if (_PySys_SetAttr(&_Py_ID(stdin), std) < 0) { + Py_DECREF(std); + goto error; + } Py_DECREF(std); /* Set sys.stdout */ @@ -3197,8 +3211,14 @@ init_sys_streams(PyThreadState *tstate) config->stdio_errors); if (std == NULL) goto error; - PySys_SetObject("__stdout__", std); - _PySys_SetAttr(&_Py_ID(stdout), std); + if (PySys_SetObject("__stdout__", std) < 0) { + Py_DECREF(std); + goto error; + } + if (_PySys_SetAttr(&_Py_ID(stdout), std) < 0) { + Py_DECREF(std); + goto error; + } Py_DECREF(std); #if 1 /* Disable this if you have trouble debugging bootstrap stuff */