From d3a1de22705cc79d7e8a0f44c4f00255e58c8b20 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 27 Jan 2020 23:23:12 +0100 Subject: bpo-38631: Avoid Py_FatalError() in _PyCodecRegistry_Init() (GH-18217) _PyCodecRegistry_Init() now reports exceptions to the caller, rather than calling Py_FatalError(). --- Python/codecs.c | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/Python/codecs.c b/Python/codecs.c index 08e9b91..10d7696 100644 --- a/Python/codecs.c +++ b/Python/codecs.c @@ -1494,32 +1494,37 @@ static int _PyCodecRegistry_Init(void) PyInterpreterState *interp = _PyInterpreterState_Get(); PyObject *mod; - unsigned i; if (interp->codec_search_path != NULL) return 0; interp->codec_search_path = PyList_New(0); + if (interp->codec_search_path == NULL) { + return -1; + } + interp->codec_search_cache = PyDict_New(); + if (interp->codec_search_cache == NULL) { + return -1; + } + interp->codec_error_registry = PyDict_New(); + if (interp->codec_error_registry == NULL) { + return -1; + } - if (interp->codec_error_registry) { - for (i = 0; i < Py_ARRAY_LENGTH(methods); ++i) { - PyObject *func = PyCFunction_NewEx(&methods[i].def, NULL, NULL); - int res; - if (!func) - Py_FatalError("can't initialize codec error registry"); - res = PyCodec_RegisterError(methods[i].name, func); - Py_DECREF(func); - if (res) - Py_FatalError("can't initialize codec error registry"); + for (size_t i = 0; i < Py_ARRAY_LENGTH(methods); ++i) { + PyObject *func = PyCFunction_NewEx(&methods[i].def, NULL, NULL); + if (!func) { + return -1; } - } - if (interp->codec_search_path == NULL || - interp->codec_search_cache == NULL || - interp->codec_error_registry == NULL) - Py_FatalError("can't initialize codec registry"); + int res = PyCodec_RegisterError(methods[i].name, func); + Py_DECREF(func); + if (res) { + return -1; + } + } mod = PyImport_ImportModuleNoBlock("encodings"); if (mod == NULL) { -- cgit v0.12