Skip to content

Commit 26db8ed

Browse files
committed
gh-148427: Address review feedback
- Keep FIXME comment about error info - Use mock.Mock with startElement.side_effect instead of inner classes - Narrow assertRaises to only the triggering feed() call - Update NEWS wording per reviewer suggestion
1 parent 2833a88 commit 26db8ed

3 files changed

Lines changed: 22 additions & 32 deletions

File tree

Lib/test/test_sax.py

Lines changed: 18 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1057,60 +1057,51 @@ def test_expat_entityresolver_default(self):
10571057

10581058
def test_external_entity_ref_keyboard_interrupt(self):
10591059
# gh-148427: KeyboardInterrupt must propagate, not be swallowed
1060-
class KBHandler(handler.ContentHandler):
1061-
def startElement(self, name, attrs):
1062-
if name == 'entity':
1063-
raise KeyboardInterrupt('test')
1060+
eh = mock.Mock()
1061+
eh.startElement.side_effect = KeyboardInterrupt('test')
10641062

10651063
parser = create_parser()
10661064
parser.setFeature(feature_external_ges, True)
10671065
parser.setEntityResolver(self.TestEntityResolver())
1068-
parser.setContentHandler(KBHandler())
1066+
parser.setContentHandler(eh)
10691067

1068+
parser.feed('<!DOCTYPE doc [\n')
1069+
parser.feed(' <!ENTITY test SYSTEM "whatever">\n')
1070+
parser.feed(']>\n')
10701071
with self.assertRaises(KeyboardInterrupt):
1071-
parser.feed('<!DOCTYPE doc [\n')
1072-
parser.feed(' <!ENTITY test SYSTEM "whatever">\n')
1073-
parser.feed(']>\n')
10741072
parser.feed('<doc>&test;</doc>')
1075-
parser.close()
10761073

10771074
def test_external_entity_ref_system_exit(self):
10781075
# gh-148427: SystemExit must propagate, not be swallowed
1079-
class ExitHandler(handler.ContentHandler):
1080-
def startElement(self, name, attrs):
1081-
if name == 'entity':
1082-
raise SystemExit(42)
1076+
eh = mock.Mock()
1077+
eh.startElement.side_effect = SystemExit(42)
10831078

10841079
parser = create_parser()
10851080
parser.setFeature(feature_external_ges, True)
10861081
parser.setEntityResolver(self.TestEntityResolver())
1087-
parser.setContentHandler(ExitHandler())
1082+
parser.setContentHandler(eh)
10881083

1084+
parser.feed('<!DOCTYPE doc [\n')
1085+
parser.feed(' <!ENTITY test SYSTEM "whatever">\n')
1086+
parser.feed(']>\n')
10891087
with self.assertRaises(SystemExit):
1090-
parser.feed('<!DOCTYPE doc [\n')
1091-
parser.feed(' <!ENTITY test SYSTEM "whatever">\n')
1092-
parser.feed(']>\n')
10931088
parser.feed('<doc>&test;</doc>')
1094-
parser.close()
10951089

10961090
def test_external_entity_ref_stack_cleanup(self):
10971091
# gh-148427: _entity_stack must be cleaned up after errors
1098-
class ErrorHandler(handler.ContentHandler):
1099-
def startElement(self, name, attrs):
1100-
if name == 'entity':
1101-
raise ValueError('test error')
1092+
eh = mock.Mock()
1093+
eh.startElement.side_effect = ValueError('test error')
11021094

11031095
parser = create_parser()
11041096
parser.setFeature(feature_external_ges, True)
11051097
parser.setEntityResolver(self.TestEntityResolver())
1106-
parser.setContentHandler(ErrorHandler())
1098+
parser.setContentHandler(eh)
11071099

1100+
parser.feed('<!DOCTYPE doc [\n')
1101+
parser.feed(' <!ENTITY test SYSTEM "whatever">\n')
1102+
parser.feed(']>\n')
11081103
with self.assertRaises(SAXParseException):
1109-
parser.feed('<!DOCTYPE doc [\n')
1110-
parser.feed(' <!ENTITY test SYSTEM "whatever">\n')
1111-
parser.feed(']>\n')
11121104
parser.feed('<doc>&test;</doc>')
1113-
parser.close()
11141105

11151106
self.assertEqual(len(parser._entity_stack), 0)
11161107

Lib/xml/sax/expatreader.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ def external_entity_ref(self, context, base, sysid, pubid):
425425
try:
426426
xmlreader.IncrementalParser.parse(self, source)
427427
except Exception:
428-
return 0
428+
return 0 # FIXME: save error info here?
429429
finally:
430430
(self._parser, self._source) = self._entity_stack[-1]
431431
del self._entity_stack[-1]
Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
Fix bare ``except`` clause in :mod:`xml.sax` expatreader's external entity
2-
handler that silently swallowed :exc:`KeyboardInterrupt` and
3-
:exc:`SystemExit`. Also fix entity parser stack leak on errors by moving
4-
cleanup into a ``finally`` clause.
1+
Fix bare ``except`` clause in :mod:`xml.sax` Expat's external entity
2+
handler that silently swallowed :exc:`BaseException` instances such
3+
as :exc:`KeyboardInterrupt`.

0 commit comments

Comments
 (0)