changeset: 90003:9e3fc66ee0b8 branch: 3.4 parent: 90001:9f06cbb7962b user: Ned Deily date: Thu Mar 27 16:39:58 2014 -0700 files: Doc/library/pyexpat.rst Lib/test/test_pyexpat.py Misc/NEWS Modules/pyexpat.c description: Issue #6676: Ensure a meaningful exception is raised when attempting to parse more than one XML document per pyexpat xmlparser instance. (Original patches by Hirokazu Yamamoto and Amaury Forgeot d'Arc, with suggested wording by David Gutteridge) diff -r 9f06cbb7962b -r 9e3fc66ee0b8 Doc/library/pyexpat.rst --- a/Doc/library/pyexpat.rst Thu Mar 27 18:42:52 2014 -0400 +++ b/Doc/library/pyexpat.rst Thu Mar 27 16:39:58 2014 -0700 @@ -100,6 +100,11 @@ http://www.python.org/ns/ elem1 elem2 + Due to limitations in the ``Expat`` library used by :mod:`pyexpat`, + the :class:`xmlparser` instance returned can only be used to parse a single + XML document. Call ``ParserCreate`` for each document to provide unique + parser instances. + .. seealso:: @@ -119,7 +124,9 @@ Parses the contents of the string *data*, calling the appropriate handler functions to process the parsed data. *isfinal* must be true on the final call - to this method. *data* can be the empty string at any time. + to this method; it allows the parsing of a single file in fragments, + not the submission of multiple files. + *data* can be the empty string at any time. .. method:: xmlparser.ParseFile(file) diff -r 9f06cbb7962b -r 9e3fc66ee0b8 Lib/test/test_pyexpat.py --- a/Lib/test/test_pyexpat.py Thu Mar 27 18:42:52 2014 -0400 +++ b/Lib/test/test_pyexpat.py Thu Mar 27 16:39:58 2014 -0700 @@ -236,6 +236,18 @@ operations = out.out self._verify_parse_output(operations) + def test_parse_again(self): + parser = expat.ParserCreate() + file = BytesIO(data) + parser.ParseFile(file) + # Issue 6676: ensure a meaningful exception is raised when attempting + # to parse more than one XML document per xmlparser instance, + # a limitation of the Expat library. + with self.assertRaises(expat.error) as cm: + parser.ParseFile(file) + self.assertEqual(expat.ErrorString(cm.exception.code), + expat.errors.XML_ERROR_FINISHED) + class NamespaceSeparatorTest(unittest.TestCase): def test_legal(self): # Tests that make sure we get errors when the namespace_separator value diff -r 9f06cbb7962b -r 9e3fc66ee0b8 Misc/NEWS --- a/Misc/NEWS Thu Mar 27 18:42:52 2014 -0400 +++ b/Misc/NEWS Thu Mar 27 16:39:58 2014 -0700 @@ -89,6 +89,11 @@ - Issue #20817: Fix inspect.getcallargs() to fail correctly if more than 3 arguments are missing. Patch by Jeremiah Lowin. +- Issue #6676: Ensure a meaningful exception is raised when attempting + to parse more than one XML document per pyexpat xmlparser instance. + (Original patches by Hirokazu Yamamoto and Amaury Forgeot d'Arc, with + suggested wording by David Gutteridge) + Documentation ------------- diff -r 9f06cbb7962b -r 9e3fc66ee0b8 Modules/pyexpat.c --- a/Modules/pyexpat.c Thu Mar 27 18:42:52 2014 -0400 +++ b/Modules/pyexpat.c Thu Mar 27 16:39:58 2014 -0700 @@ -908,7 +908,7 @@ void *buf = XML_GetBuffer(self->itself, BUF_SIZE); if (buf == NULL) { Py_XDECREF(readmethod); - return PyErr_NoMemory(); + return get_parse_result(self, 0); } bytes_read = readinst(buf, BUF_SIZE, readmethod);