mirror of https://github.com/python/cpython
Issue #28871: Fixed a crash when deallocate deep ElementTree.
This commit is contained in:
parent
fb2ae15c67
commit
18f018ca12
|
@ -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):
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------- */
|
||||||
|
|
Loading…
Reference in New Issue