mirror of
https://github.com/python/cpython.git
synced 2025-10-09 16:34:44 +00:00
[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 c8d8e15bfc
)
This commit is contained in:
parent
1658ec0757
commit
49caab46f6
3 changed files with 60 additions and 2 deletions
|
@ -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>'
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue