]> granicus.if.org Git - python/commitdiff
Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
authorEli Bendersky <eliben@gmail.com>
Thu, 10 Jan 2013 14:27:53 +0000 (06:27 -0800)
committerEli Bendersky <eliben@gmail.com>
Thu, 10 Jan 2013 14:27:53 +0000 (06:27 -0800)
Patch by Serhiy Storchaka

Lib/test/test_xml_etree.py
Misc/NEWS
Modules/_elementtree.c

index 9746934b792f82b54c5e8a247f12659d7655fe41..68dd1cc7bc1541261c5a919a7d8534fce629cc72 100644 (file)
@@ -1904,6 +1904,10 @@ class ElementIterTest(unittest.TestCase):
         tree = ET.ElementTree(None)
         self.assertRaises(AttributeError, tree.iter)
 
+        # Issue #16913
+        doc = ET.XML("<root>a&amp;<sub>b&amp;</sub>c&amp;</root>")
+        self.assertEqual(''.join(doc.itertext()), 'a&b&c&')
+
     def test_corners(self):
         # single root, no subelements
         a = ET.Element('a')
index 0c1be4610dfc658a898c4272926ccba73e4feb50..fcd86943df15e69276d876bb0511eb9efeeae365 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -348,6 +348,8 @@ Library
 - Issue #16089: Allow ElementTree.TreeBuilder to work again with a non-Element
   element_factory (fixes a regression in SimpleTAL).
 
+- Issue #16913: Fix Element.itertext()'s handling of text with XML entities.
+
 - Issue #16034: Fix performance regressions in the new `bz2.BZ2File`
   implementation.  Initial patch by Serhiy Storchaka.
 
index 4b53037637ea557fb2122dbf9373064c837d29c0..2129fc2d1eb4368cf0c2a3f3c570492dadfeb73b 100644 (file)
@@ -2017,7 +2017,9 @@ elementiter_next(ElementIterObject *it)
                     PyObject_RichCompareBool(it->root_element->tag,
                                              it->sought_tag, Py_EQ) == 1) {
                     if (it->gettext) {
-                        PyObject *text = JOIN_OBJ(it->root_element->text);
+                        PyObject *text = element_get_text(it->root_element);
+                        if (!text)
+                            return NULL;
                         if (PyObject_IsTrue(text)) {
                             Py_INCREF(text);
                             return text;
@@ -2047,7 +2049,9 @@ elementiter_next(ElementIterObject *it)
             }
 
             if (it->gettext) {
-                PyObject *text = JOIN_OBJ(child->text);
+                PyObject *text = element_get_text(child);
+                if (!text)
+                    return NULL;
                 if (PyObject_IsTrue(text)) {
                     Py_INCREF(text);
                     return text;
@@ -2062,8 +2066,15 @@ elementiter_next(ElementIterObject *it)
                 continue;
         }
         else {
-            PyObject *tail = it->gettext ? JOIN_OBJ(cur_parent->tail) : Py_None;            
+            PyObject *tail;
             ParentLocator *next = it->parent_stack->next;
+            if (it->gettext) {
+                tail = element_get_tail(cur_parent);
+                if (!tail)
+                    return NULL;
+            }
+            else
+                tail = Py_None;
             Py_XDECREF(it->parent_stack->parent);
             PyObject_Free(it->parent_stack);
             it->parent_stack = next;