gh-140593: Fix a memory leak in function my_ElementDeclHandler of pyexpat (#140602)

Ensure that the memory allocated for the content model
passed to `my_ElementDeclHandler` is freed in all error
paths.
This commit is contained in:
Sebastian Pipping 2025-10-26 14:45:32 +01:00 committed by GitHub
parent 37827c1752
commit e34a5e3304
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 21 additions and 1 deletions

View file

@ -684,6 +684,23 @@ class ChardataBufferTest(unittest.TestCase):
parser.Parse(xml2, True)
self.assertEqual(self.n, 4)
class ElementDeclHandlerTest(unittest.TestCase):
def test_trigger_leak(self):
# Unfixed, this test would leak the memory of the so-called
# "content model" in function ``my_ElementDeclHandler`` of pyexpat.
# See https://github.com/python/cpython/issues/140593.
data = textwrap.dedent('''\
<!DOCTYPE quotations SYSTEM "quotations.dtd" [
<!ELEMENT root ANY>
]>
<root/>
''').encode('UTF-8')
parser = expat.ParserCreate()
parser.NotStandaloneHandler = lambda: 1.234 # arbitrary float
parser.ElementDeclHandler = lambda _1, _2: None
self.assertRaises(TypeError, parser.Parse, data, True)
class MalformedInputTest(unittest.TestCase):
def test1(self):
xml = b"\0\r\n"

View file

@ -0,0 +1,3 @@
:mod:`xml.parsers.expat`: Fix a memory leak that could affect users with
:meth:`~xml.parsers.expat.xmlparser.ElementDeclHandler` set to a custom
element declaration handler. Patch by Sebastian Pipping.

View file

@ -642,7 +642,7 @@ my_ElementDeclHandler(void *userData,
PyObject *modelobj, *nameobj;
if (PyErr_Occurred())
return;
goto finally;
if (flush_character_buffer(self) < 0)
goto finally;