Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions Lib/test/test_sax.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -1055,6 +1056,32 @@ def test_expat_entityresolver_default(self):
self.assertEqual(result.getvalue(), start +
b"<doc></doc>")

@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('<!DOCTYPE doc [\n')
parser.feed(' <!ENTITY test SYSTEM "whatever">\n')
parser.feed(']>\n')
trigger = '<doc>&test;</doc>'

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):
Expand Down
2 changes: 1 addition & 1 deletion Lib/xml/sax/expatreader.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
Original file line number Diff line number Diff line change
@@ -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`.
Loading