gh-105375: Harden pyexpat initialisation (#105606)

Add proper error handling to add_errors_module() to prevent exceptions
from possibly being overwritten.
This commit is contained in:
Erlend E. Aasland 2023-06-11 22:18:46 +02:00 committed by GitHub
parent 41cddc2e93
commit 20a56d8bec
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 15 additions and 8 deletions

View file

@ -0,0 +1,3 @@
Harden :mod:`pyexpat` error handling during module initialisation to prevent
exceptions from possibly being overwritten, and objects from being
dereferenced twice.

View file

@ -1775,14 +1775,18 @@ add_error(PyObject *errors_module, PyObject *codes_dict,
static int static int
add_errors_module(PyObject *mod) add_errors_module(PyObject *mod)
{ {
// add_submodule() returns a borrowed ref.
PyObject *errors_module = add_submodule(mod, MODULE_NAME ".errors"); PyObject *errors_module = add_submodule(mod, MODULE_NAME ".errors");
if (errors_module == NULL) { if (errors_module == NULL) {
return -1; return -1;
} }
PyObject *codes_dict = PyDict_New(); PyObject *codes_dict = PyDict_New();
if (codes_dict == NULL) {
return -1;
}
PyObject *rev_codes_dict = PyDict_New(); PyObject *rev_codes_dict = PyDict_New();
if (codes_dict == NULL || rev_codes_dict == NULL) { if (rev_codes_dict == NULL) {
goto error; goto error;
} }
@ -1803,17 +1807,17 @@ add_errors_module(PyObject *mod)
goto error; goto error;
} }
if (PyModule_AddObject(errors_module, "codes", Py_NewRef(codes_dict)) < 0) { int rc = PyModule_AddObjectRef(errors_module, "codes", codes_dict);
Py_DECREF(codes_dict);
goto error;
}
Py_CLEAR(codes_dict); Py_CLEAR(codes_dict);
if (rc < 0) {
if (PyModule_AddObject(errors_module, "messages", Py_NewRef(rev_codes_dict)) < 0) {
Py_DECREF(rev_codes_dict);
goto error; goto error;
} }
rc = PyModule_AddObjectRef(errors_module, "messages", rev_codes_dict);
Py_CLEAR(rev_codes_dict); Py_CLEAR(rev_codes_dict);
if (rc < 0) {
goto error;
}
return 0; return 0;