From 8112ea2360b1a536b4931fd13173a7bbe5ac7aa1 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Mon, 24 Sep 2012 13:17:08 +0200 Subject: [PATCH] Issue #16012: Fix a regression in pyexpat. The parser's UseForeignDTD() method doesn't require an argument again. --- Lib/test/test_pyexpat.py | 55 +++++++++++++++++++++++++++++++++++++++- Misc/NEWS | 6 +++++ Modules/pyexpat.c | 2 +- 3 files changed, 61 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_pyexpat.py b/Lib/test/test_pyexpat.py index 75b031ac178..b911a2058cc 100644 --- a/Lib/test/test_pyexpat.py +++ b/Lib/test/test_pyexpat.py @@ -588,6 +588,58 @@ class MalformedInputText(unittest.TestCase): except expat.ExpatError as e: self.assertEqual(str(e), 'XML declaration not well-formed: line 1, column 14') +class ForeignDTDTests(unittest.TestCase): + """ + Tests for the UseForeignDTD method of expat parser objects. + """ + def test_use_foreign_dtd(self): + """ + If UseForeignDTD is passed True and a document without an external + entity reference is parsed, ExternalEntityRefHandler is first called + with None for the public and system ids. + """ + handler_call_args = [] + def resolve_entity(context, base, system_id, public_id): + handler_call_args.append((public_id, system_id)) + return 1 + + parser = expat.ParserCreate() + parser.UseForeignDTD(True) + parser.SetParamEntityParsing(expat.XML_PARAM_ENTITY_PARSING_ALWAYS) + parser.ExternalEntityRefHandler = resolve_entity + parser.Parse("") + self.assertEqual(handler_call_args, [(None, None)]) + + # test UseForeignDTD() is equal to UseForeignDTD(True) + handler_call_args[:] = [] + + parser = expat.ParserCreate() + parser.UseForeignDTD() + parser.SetParamEntityParsing(expat.XML_PARAM_ENTITY_PARSING_ALWAYS) + parser.ExternalEntityRefHandler = resolve_entity + parser.Parse("") + self.assertEqual(handler_call_args, [(None, None)]) + + def test_ignore_use_foreign_dtd(self): + """ + If UseForeignDTD is passed True and a document with an external + entity reference is parsed, ExternalEntityRefHandler is called with + the public and system ids from the document. + """ + handler_call_args = [] + def resolve_entity(context, base, system_id, public_id): + handler_call_args.append((public_id, system_id)) + return 1 + + parser = expat.ParserCreate() + parser.UseForeignDTD(True) + parser.SetParamEntityParsing(expat.XML_PARAM_ENTITY_PARSING_ALWAYS) + parser.ExternalEntityRefHandler = resolve_entity + parser.Parse( + "") + self.assertEqual(handler_call_args, [("bar", "baz")]) + + def test_main(): run_unittest(SetAttributeTest, ParseTest, @@ -598,7 +650,8 @@ def test_main(): PositionTest, sf1296433Test, ChardataBufferTest, - MalformedInputText) + MalformedInputText, + ForeignDTDTests) if __name__ == "__main__": test_main() diff --git a/Misc/NEWS b/Misc/NEWS index 84d4bd1910c..bbdd5e54338 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -379,6 +379,12 @@ Library - Issue #6884: Fix long-standing bugs with MANIFEST.in parsing in distutils on Windows. +Extension Modules +----------------- + +- Issue #16012: Fix a regression in pyexpat. The parser's UseForeignDTD() + method doesn't require an argument again. + Tests ----- diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index 4d9a1e59849..f2691136ca8 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -1176,7 +1176,7 @@ xmlparse_UseForeignDTD(xmlparseobject *self, PyObject *args) PyObject *flagobj = NULL; int flag = 1; enum XML_Error rc; - if (!PyArg_ParseTuple(args, "O:UseForeignDTD", &flagobj)) + if (!PyArg_ParseTuple(args, "|O:UseForeignDTD", &flagobj)) return NULL; if (flagobj != NULL) { flag = PyObject_IsTrue(flagobj);