]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-38631: Avoid Py_FatalError() in _PyCodecRegistry_Init() (GH-18217)
authorVictor Stinner <vstinner@python.org>
Mon, 27 Jan 2020 22:23:12 +0000 (23:23 +0100)
committerGitHub <noreply@github.com>
Mon, 27 Jan 2020 22:23:12 +0000 (23:23 +0100)
_PyCodecRegistry_Init() now reports exceptions to the caller,
rather than calling Py_FatalError().

Python/codecs.c

index 08e9b916f201d5d316c7cd4b1b1147d9b542d22a..10d76969a519de514ad9f55c65e240aa18c07688 100644 (file)
@@ -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) {