mirror of
https://github.com/python/cpython.git
synced 2025-08-04 17:08:35 +00:00
bpo-38392: PyObject_GC_Track() validates object in debug mode (GH-16615)
In debug mode, PyObject_GC_Track() now calls tp_traverse() of the object type to ensure that the object is valid: test that objects visited by tp_traverse() are valid. Fix pyexpat.c: only track the parser in the GC once the parser is fully initialized.
This commit is contained in:
parent
7775349895
commit
1b18455695
4 changed files with 27 additions and 4 deletions
|
@ -938,7 +938,6 @@ pyexpat_xmlparser_ExternalEntityParserCreate_impl(xmlparseobject *self,
|
|||
new_parser->handlers = 0;
|
||||
new_parser->intern = self->intern;
|
||||
Py_XINCREF(new_parser->intern);
|
||||
PyObject_GC_Track(new_parser);
|
||||
|
||||
if (self->buffer != NULL) {
|
||||
new_parser->buffer = PyMem_Malloc(new_parser->buffer_size);
|
||||
|
@ -975,6 +974,8 @@ pyexpat_xmlparser_ExternalEntityParserCreate_impl(xmlparseobject *self,
|
|||
handler_info[i].handler);
|
||||
}
|
||||
}
|
||||
|
||||
PyObject_GC_Track(new_parser);
|
||||
return (PyObject *)new_parser;
|
||||
}
|
||||
|
||||
|
@ -1122,7 +1123,6 @@ newxmlparseobject(const char *encoding, const char *namespace_separator, PyObjec
|
|||
self->handlers = NULL;
|
||||
self->intern = intern;
|
||||
Py_XINCREF(self->intern);
|
||||
PyObject_GC_Track(self);
|
||||
|
||||
/* namespace_separator is either NULL or contains one char + \0 */
|
||||
self->itself = XML_ParserCreate_MM(encoding, &ExpatMemoryHandler,
|
||||
|
@ -1152,6 +1152,7 @@ newxmlparseobject(const char *encoding, const char *namespace_separator, PyObjec
|
|||
}
|
||||
clear_handlers(self, 1);
|
||||
|
||||
PyObject_GC_Track(self);
|
||||
return (PyObject*)self;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue