From ff2aab6fb232dd2b8eb214e11894c1463fdbe3eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?tonghuaroot=20=28=E7=AB=A5=E8=AF=9D=29?= Date: Fri, 31 Jul 2026 18:58:59 +0800 Subject: [PATCH] gh-154738: Propagate reparse-deferral setting to pyexpat subparsers (GH-154739) (cherry picked from commit 7d760134cc20f444412c54fc8395ca6f2421ad73) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: tonghuaroot (童话) --- Lib/test/test_pyexpat.py | 7 +++++++ .../Library/2026-07-26-00-00-00.gh-issue-154738.Rd5Pxe.rst | 3 +++ Modules/pyexpat.c | 1 + 3 files changed, 11 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2026-07-26-00-00-00.gh-issue-154738.Rd5Pxe.rst diff --git a/Lib/test/test_pyexpat.py b/Lib/test/test_pyexpat.py index 157db98c4d4a917..b3609ac3e68bd81 100644 --- a/Lib/test/test_pyexpat.py +++ b/Lib/test/test_pyexpat.py @@ -996,6 +996,13 @@ def test_parent_parser_outlives_its_subparsers__chain(self): del parser del subparser + def test_subparser_inherits_reparse_deferral(self): + for enabled in (True, False): + parser = expat.ParserCreate() + parser.SetReparseDeferralEnabled(enabled) + subparser = parser.ExternalEntityParserCreate(None) + self.assertEqual(subparser.GetReparseDeferralEnabled(), enabled) + class ExternalEntityParserCreateErrorTest(unittest.TestCase): """ExternalEntityParserCreate error paths should not crash or leak diff --git a/Misc/NEWS.d/next/Library/2026-07-26-00-00-00.gh-issue-154738.Rd5Pxe.rst b/Misc/NEWS.d/next/Library/2026-07-26-00-00-00.gh-issue-154738.Rd5Pxe.rst new file mode 100644 index 000000000000000..1a6e1a301db466f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-07-26-00-00-00.gh-issue-154738.Rd5Pxe.rst @@ -0,0 +1,3 @@ +Fix :meth:`!ExternalEntityParserCreate` not propagating the reparse-deferral +setting to the subparser, which left :meth:`!GetReparseDeferralEnabled` +returning an uninitialized value. Patch by tonghuaroot. diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index da8b0fb6b483a1b..7094927ad2058fc 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -1117,6 +1117,7 @@ pyexpat_xmlparser_ExternalEntityParserCreate_impl(xmlparseobject *self, new_parser->specified_attributes = self->specified_attributes; new_parser->in_callback = 0; new_parser->ns_prefixes = self->ns_prefixes; + new_parser->reparse_deferral_enabled = self->reparse_deferral_enabled; new_parser->itself = XML_ExternalEntityParserCreate(self->itself, context, encoding); // The new subparser will make use of the parent XML_Parser inside of Expat.