Issue #28871: Fixed a crash when deallocate deep ElementTree.

This commit is contained in:
Serhiy Storchaka 2016-12-21 12:32:56 +02:00
parent fb2ae15c67
commit 18f018ca12
3 changed files with 14 additions and 0 deletions

View File

@ -11,6 +11,7 @@ cET_alias = import_fresh_module('xml.etree.cElementTree',
fresh=['_elementtree', 'xml.etree']) fresh=['_elementtree', 'xml.etree'])
@unittest.skipUnless(cET, 'requires _elementtree')
class MiscTests(unittest.TestCase): class MiscTests(unittest.TestCase):
# Issue #8651. # Issue #8651.
@support.bigmemtest(size=support._2G + 100, memuse=1, dry_run=False) @support.bigmemtest(size=support._2G + 100, memuse=1, dry_run=False)
@ -54,6 +55,15 @@ class MiscTests(unittest.TestCase):
del element.attrib del element.attrib
self.assertEqual(element.attrib, {'A': 'B', 'C': 'D'}) self.assertEqual(element.attrib, {'A': 'B', 'C': 'D'})
def test_trashcan(self):
# If this test fails, it will most likely die via segfault.
e = root = cET.Element('root')
for i in range(200000):
e = cET.SubElement(e, 'x')
del e
del root
support.gc_collect()
@unittest.skipUnless(cET, 'requires _elementtree') @unittest.skipUnless(cET, 'requires _elementtree')
class TestAliasWorking(unittest.TestCase): class TestAliasWorking(unittest.TestCase):

View File

@ -138,6 +138,8 @@ Core and Builtins
Library Library
------- -------
- Issue #28871: Fixed a crash when deallocate deep ElementTree.
- Issue #19542: Fix bugs in WeakValueDictionary.setdefault() and - Issue #19542: Fix bugs in WeakValueDictionary.setdefault() and
WeakValueDictionary.pop() when a GC collection happens in another WeakValueDictionary.pop() when a GC collection happens in another
thread. thread.

View File

@ -652,6 +652,7 @@ static void
element_dealloc(ElementObject* self) element_dealloc(ElementObject* self)
{ {
PyObject_GC_UnTrack(self); PyObject_GC_UnTrack(self);
Py_TRASHCAN_SAFE_BEGIN(self)
if (self->weakreflist != NULL) if (self->weakreflist != NULL)
PyObject_ClearWeakRefs((PyObject *) self); PyObject_ClearWeakRefs((PyObject *) self);
@ -662,6 +663,7 @@ element_dealloc(ElementObject* self)
RELEASE(sizeof(ElementObject), "destroy element"); RELEASE(sizeof(ElementObject), "destroy element");
Py_TYPE(self)->tp_free((PyObject *)self); Py_TYPE(self)->tp_free((PyObject *)self);
Py_TRASHCAN_SAFE_END(self)
} }
/* -------------------------------------------------------------------- */ /* -------------------------------------------------------------------- */