[Python-checkins] bpo-38631: Avoid Py_FatalError() in _PyCodecRegistry_Init() (GH-18217)

Victor Stinner webhook-mailer at python.org
Mon Jan 27 17:23:19 EST 2020


https://github.com/python/cpython/commit/d3a1de22705cc79d7e8a0f44c4f00255e58c8b20
commit: d3a1de22705cc79d7e8a0f44c4f00255e58c8b20
branch: master
author: Victor Stinner <vstinner at python.org>
committer: GitHub <noreply at github.com>
date: 2020-01-27T23:23:12+01:00
summary:

bpo-38631: Avoid Py_FatalError() in _PyCodecRegistry_Init() (GH-18217)

_PyCodecRegistry_Init() now reports exceptions to the caller,
rather than calling Py_FatalError().

files:
M Python/codecs.c

diff --git a/Python/codecs.c b/Python/codecs.c
index 08e9b916f201d..10d76969a519d 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) {



More information about the Python-checkins mailing list