diff --git a/Lib/test/test_sax.py b/Lib/test/test_sax.py index 29babd7bf6996a..d851b93af1f563 100644 --- a/Lib/test/test_sax.py +++ b/Lib/test/test_sax.py @@ -25,6 +25,7 @@ from urllib.error import URLError import urllib.request from test.support import os_helper +from test import support from test.support import findfile, check__all__ from test.support.os_helper import FakePath, TESTFN @@ -1055,6 +1056,32 @@ def test_expat_entityresolver_default(self): self.assertEqual(result.getvalue(), start + b"") + @support.subTests("exc_type", [KeyboardInterrupt, SystemExit, ValueError]) + def test_external_entity_parser_with_exceptions(self, exc_type): + # gh-148427: BaseException subclasses must propagate, not be swallowed + def raise_on_entity(name, attrs): + if name == 'entity': + raise exc_type("test") + + handler = mock.Mock() + handler.startElement = raise_on_entity + + parser = create_parser() + parser.setFeature(feature_external_ges, True) + parser.setEntityResolver(self.TestEntityResolver()) + parser.setContentHandler(handler) + + parser.feed('\n') + parser.feed(']>\n') + trigger = '&test;' + + if issubclass(exc_type, Exception): + self.assertRaises(SAXParseException, parser.feed, trigger) + else: + with self.assertRaisesRegex(exc_type, "test"): + parser.feed(trigger) + # ===== Attributes support class AttrGatherer(ContentHandler): diff --git a/Lib/xml/sax/expatreader.py b/Lib/xml/sax/expatreader.py index 37b1add2848487..54c768f96bdb1a 100644 --- a/Lib/xml/sax/expatreader.py +++ b/Lib/xml/sax/expatreader.py @@ -424,7 +424,7 @@ def external_entity_ref(self, context, base, sysid, pubid): try: xmlreader.IncrementalParser.parse(self, source) - except: + except Exception: return 0 # FIXME: save error info here? (self._parser, self._source) = self._entity_stack[-1] diff --git a/Misc/NEWS.d/next/Library/2026-04-12-09-52-14.gh-issue-148427.xR7v3m.rst b/Misc/NEWS.d/next/Library/2026-04-12-09-52-14.gh-issue-148427.xR7v3m.rst new file mode 100644 index 00000000000000..4f941c68ec9278 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-04-12-09-52-14.gh-issue-148427.xR7v3m.rst @@ -0,0 +1,3 @@ +Fix bare ``except`` clause in :mod:`xml.sax` Expat's external entity +handler that silently swallowed :exc:`BaseException` instances such +as :exc:`KeyboardInterrupt`.