Issue #25691: Fixed crash on deleting ElementTree.Element attributes.
This commit is contained in:
parent
8bc792a602
commit
b6aa5375d5
|
@ -244,6 +244,33 @@ class ElementTreeTest(unittest.TestCase):
|
||||||
self.assertEqual(ET.XML, ET.fromstring)
|
self.assertEqual(ET.XML, ET.fromstring)
|
||||||
self.assertEqual(ET.PI, ET.ProcessingInstruction)
|
self.assertEqual(ET.PI, ET.ProcessingInstruction)
|
||||||
|
|
||||||
|
def test_set_attribute(self):
|
||||||
|
element = ET.Element('tag')
|
||||||
|
|
||||||
|
self.assertEqual(element.tag, 'tag')
|
||||||
|
element.tag = 'Tag'
|
||||||
|
self.assertEqual(element.tag, 'Tag')
|
||||||
|
element.tag = 'TAG'
|
||||||
|
self.assertEqual(element.tag, 'TAG')
|
||||||
|
|
||||||
|
self.assertIsNone(element.text)
|
||||||
|
element.text = 'Text'
|
||||||
|
self.assertEqual(element.text, 'Text')
|
||||||
|
element.text = 'TEXT'
|
||||||
|
self.assertEqual(element.text, 'TEXT')
|
||||||
|
|
||||||
|
self.assertIsNone(element.tail)
|
||||||
|
element.tail = 'Tail'
|
||||||
|
self.assertEqual(element.tail, 'Tail')
|
||||||
|
element.tail = 'TAIL'
|
||||||
|
self.assertEqual(element.tail, 'TAIL')
|
||||||
|
|
||||||
|
self.assertEqual(element.attrib, {})
|
||||||
|
element.attrib = {'a': 'b', 'c': 'd'}
|
||||||
|
self.assertEqual(element.attrib, {'a': 'b', 'c': 'd'})
|
||||||
|
element.attrib = {'A': 'B', 'C': 'D'}
|
||||||
|
self.assertEqual(element.attrib, {'A': 'B', 'C': 'D'})
|
||||||
|
|
||||||
def test_simpleops(self):
|
def test_simpleops(self):
|
||||||
# Basic method sanity checks.
|
# Basic method sanity checks.
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,38 @@ class MiscTests(unittest.TestCase):
|
||||||
finally:
|
finally:
|
||||||
data = None
|
data = None
|
||||||
|
|
||||||
|
def test_del_attribute(self):
|
||||||
|
element = cET.Element('tag')
|
||||||
|
|
||||||
|
element.tag = 'TAG'
|
||||||
|
with self.assertRaises(AttributeError):
|
||||||
|
del element.tag
|
||||||
|
self.assertEqual(element.tag, 'TAG')
|
||||||
|
|
||||||
|
with self.assertRaises(AttributeError):
|
||||||
|
del element.text
|
||||||
|
self.assertIsNone(element.text)
|
||||||
|
element.text = 'TEXT'
|
||||||
|
with self.assertRaises(AttributeError):
|
||||||
|
del element.text
|
||||||
|
self.assertEqual(element.text, 'TEXT')
|
||||||
|
|
||||||
|
with self.assertRaises(AttributeError):
|
||||||
|
del element.tail
|
||||||
|
self.assertIsNone(element.tail)
|
||||||
|
element.tail = 'TAIL'
|
||||||
|
with self.assertRaises(AttributeError):
|
||||||
|
del element.tail
|
||||||
|
self.assertEqual(element.tail, 'TAIL')
|
||||||
|
|
||||||
|
with self.assertRaises(AttributeError):
|
||||||
|
del element.attrib
|
||||||
|
self.assertEqual(element.attrib, {})
|
||||||
|
element.attrib = {'A': 'B', 'C': 'D'}
|
||||||
|
with self.assertRaises(AttributeError):
|
||||||
|
del element.attrib
|
||||||
|
self.assertEqual(element.attrib, {'A': 'B', 'C': 'D'})
|
||||||
|
|
||||||
|
|
||||||
@unittest.skipUnless(cET, 'requires _elementtree')
|
@unittest.skipUnless(cET, 'requires _elementtree')
|
||||||
class TestAliasWorking(unittest.TestCase):
|
class TestAliasWorking(unittest.TestCase):
|
||||||
|
|
|
@ -106,6 +106,8 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #25691: Fixed crash on deleting ElementTree.Element attributes.
|
||||||
|
|
||||||
- Issue #25624: ZipFile now always writes a ZIP_STORED header for directory
|
- Issue #25624: ZipFile now always writes a ZIP_STORED header for directory
|
||||||
entries. Patch by Dingyuan Wang.
|
entries. Patch by Dingyuan Wang.
|
||||||
|
|
||||||
|
|
|
@ -1852,6 +1852,12 @@ static int
|
||||||
element_setattro(ElementObject* self, PyObject* nameobj, PyObject* value)
|
element_setattro(ElementObject* self, PyObject* nameobj, PyObject* value)
|
||||||
{
|
{
|
||||||
char *name = "";
|
char *name = "";
|
||||||
|
|
||||||
|
if (value == NULL) {
|
||||||
|
PyErr_SetString(PyExc_AttributeError,
|
||||||
|
"can't delete attribute");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
if (PyUnicode_Check(nameobj))
|
if (PyUnicode_Check(nameobj))
|
||||||
name = _PyUnicode_AsString(nameobj);
|
name = _PyUnicode_AsString(nameobj);
|
||||||
if (name == NULL)
|
if (name == NULL)
|
||||||
|
|
Loading…
Reference in New Issue