Skip to content

Commit 4df452c

Browse files
committed
gh-145989: Fix double Py_DECREF in pyexpat ExternalEntityParserCreate
Remove redundant Py_DECREF(self) from three error paths in ExternalEntityParserCreate_impl(). The dealloc of new_parser already decrements the parent reference via Py_CLEAR(self->parent). Use Py_NewRef() for the parent assignment for clarity.
1 parent 36b5284 commit 4df452c

1 file changed

Lines changed: 1 addition & 5 deletions

File tree

Modules/pyexpat.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1086,7 +1086,6 @@ pyexpat_xmlparser_ExternalEntityParserCreate_impl(xmlparseobject *self,
10861086
// The new subparser will make use of the parent XML_Parser inside of Expat.
10871087
// So we need to take subparsers into account with the reference counting
10881088
// of their parent parser.
1089-
Py_INCREF(self);
10901089

10911090
new_parser->buffer_size = self->buffer_size;
10921091
new_parser->buffer_used = 0;
@@ -1097,21 +1096,19 @@ pyexpat_xmlparser_ExternalEntityParserCreate_impl(xmlparseobject *self,
10971096
new_parser->ns_prefixes = self->ns_prefixes;
10981097
new_parser->itself = XML_ExternalEntityParserCreate(self->itself, context,
10991098
encoding);
1100-
new_parser->parent = (PyObject *)self;
1099+
new_parser->parent = Py_NewRef(self);
11011100
new_parser->handlers = 0;
11021101
new_parser->intern = Py_XNewRef(self->intern);
11031102

11041103
if (self->buffer != NULL) {
11051104
new_parser->buffer = PyMem_Malloc(new_parser->buffer_size);
11061105
if (new_parser->buffer == NULL) {
11071106
Py_DECREF(new_parser);
1108-
Py_DECREF(self);
11091107
return PyErr_NoMemory();
11101108
}
11111109
}
11121110
if (!new_parser->itself) {
11131111
Py_DECREF(new_parser);
1114-
Py_DECREF(self);
11151112
return PyErr_NoMemory();
11161113
}
11171114

@@ -1125,7 +1122,6 @@ pyexpat_xmlparser_ExternalEntityParserCreate_impl(xmlparseobject *self,
11251122
new_parser->handlers = PyMem_New(PyObject *, i);
11261123
if (!new_parser->handlers) {
11271124
Py_DECREF(new_parser);
1128-
Py_DECREF(self);
11291125
return PyErr_NoMemory();
11301126
}
11311127
clear_handlers(new_parser, 1);

0 commit comments

Comments
 (0)