Skip to content

Commit

Permalink
bpo-38631: Avoid Py_FatalError() in _PyCodecRegistry_Init() (GH-18217)
Browse files Browse the repository at this point in the history
_PyCodecRegistry_Init() now reports exceptions to the caller,
rather than calling Py_FatalError().
  • Loading branch information
vstinner committed Jan 27, 2020
1 parent dd023ad commit d3a1de2
Showing 1 changed file with 21 additions and 16 deletions.
37 changes: 21 additions & 16 deletions Python/codecs.c
Expand Up @@ -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) {
Expand Down

0 comments on commit d3a1de2

Please sign in to comment.