Skip to content

Commit

Permalink
gh-105375: Harden pyexpat initialisation (#105606)
Browse files Browse the repository at this point in the history
Add proper error handling to add_errors_module() to prevent exceptions
from possibly being overwritten.
  • Loading branch information
erlend-aasland committed Jun 11, 2023
1 parent 41cddc2 commit 20a56d8
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 7 deletions.
@@ -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.
18 changes: 11 additions & 7 deletions Modules/pyexpat.c
Expand Up @@ -1775,14 +1775,18 @@ add_error(PyObject *errors_module, PyObject *codes_dict,
static int
add_errors_module(PyObject *mod)
{
// add_submodule() returns a borrowed ref.
PyObject *errors_module = add_submodule(mod, MODULE_NAME ".errors");
if (errors_module == NULL) {
return -1;
}

PyObject *codes_dict = PyDict_New();
if (codes_dict == NULL) {
return -1;
}
PyObject *rev_codes_dict = PyDict_New();
if (codes_dict == NULL || rev_codes_dict == NULL) {
if (rev_codes_dict == NULL) {
goto error;
}

Expand All @@ -1803,17 +1807,17 @@ add_errors_module(PyObject *mod)
goto error;
}

if (PyModule_AddObject(errors_module, "codes", Py_NewRef(codes_dict)) < 0) {
Py_DECREF(codes_dict);
int rc = PyModule_AddObjectRef(errors_module, "codes", codes_dict);
Py_CLEAR(codes_dict);
if (rc < 0) {
goto error;
}
Py_CLEAR(codes_dict);

if (PyModule_AddObject(errors_module, "messages", Py_NewRef(rev_codes_dict)) < 0) {
Py_DECREF(rev_codes_dict);
rc = PyModule_AddObjectRef(errors_module, "messages", rev_codes_dict);
Py_CLEAR(rev_codes_dict);
if (rc < 0) {
goto error;
}
Py_CLEAR(rev_codes_dict);

return 0;

Expand Down

0 comments on commit 20a56d8

Please sign in to comment.