summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2017-09-14 23:13:21 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2017-09-14 23:13:21 (GMT)
commit49caab46f687eb201898fb6c2c40d47bdcb0e58b (patch)
tree4fc89fa36e1b325e5f2e2a9ae1e63cbe6a597e49 /Lib
parent1658ec07577ef9696cea76fcf7fac2da18403ec5 (diff)
downloadcpython-49caab46f687eb201898fb6c2c40d47bdcb0e58b.zip
cpython-49caab46f687eb201898fb6c2c40d47bdcb0e58b.tar.gz
cpython-49caab46f687eb201898fb6c2c40d47bdcb0e58b.tar.bz2
[3.6] bpo-31455: Fix an assertion failure in ElementTree.XMLParser(). (GH-3545) (#3585)
* Avoid calling "PyObject_GetAttrString()" (and potentially executing user code) with a live exception set. * Ignore only AttributeError on attribute lookups in ElementTree.XMLParser() and propagate all other exceptions. (cherry picked from commit c8d8e15bfc24abeeaaf3d8be9073276b0c011cdf)
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_xml_etree.py25
1 files changed, 25 insertions, 0 deletions
diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py
index 15af1fc..ad0ffb3 100644
--- a/Lib/test/test_xml_etree.py
+++ b/Lib/test/test_xml_etree.py
@@ -2476,6 +2476,31 @@ class TreeBuilderTest(unittest.TestCase):
('html', '-//W3C//DTD XHTML 1.0 Transitional//EN',
'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'))
+ def test_builder_lookup_errors(self):
+ class RaisingBuilder:
+ def __init__(self, raise_in=None, what=ValueError):
+ self.raise_in = raise_in
+ self.what = what
+
+ def __getattr__(self, name):
+ if name == self.raise_in:
+ raise self.what(self.raise_in)
+ def handle(*args):
+ pass
+ return handle
+
+ ET.XMLParser(target=RaisingBuilder())
+ # cET also checks for 'close' and 'doctype', PyET does it only at need
+ for event in ('start', 'data', 'end', 'comment', 'pi'):
+ with self.assertRaisesRegex(ValueError, event):
+ ET.XMLParser(target=RaisingBuilder(event))
+
+ ET.XMLParser(target=RaisingBuilder(what=AttributeError))
+ for event in ('start', 'data', 'end', 'comment', 'pi'):
+ parser = ET.XMLParser(target=RaisingBuilder(event, what=AttributeError))
+ parser.feed(self.sample1)
+ self.assertIsNone(parser.close())
+
class XMLParserTest(unittest.TestCase):
sample1 = b'<file><line>22</line></file>'