diff options
-rw-r--r-- | Doc/library/pyexpat.rst | 8 | ||||
-rw-r--r-- | Lib/test/test_pyexpat.py | 11 | ||||
-rw-r--r-- | Misc/NEWS | 5 | ||||
-rw-r--r-- | Modules/pyexpat.c | 2 |
4 files changed, 24 insertions, 2 deletions
diff --git a/Doc/library/pyexpat.rst b/Doc/library/pyexpat.rst index 5ce4c02..20ca3bc 100644 --- a/Doc/library/pyexpat.rst +++ b/Doc/library/pyexpat.rst @@ -103,6 +103,10 @@ The :mod:`xml.parsers.expat` module contains two functions: 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:: @@ -122,7 +126,9 @@ XMLParser Objects 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 --git a/Lib/test/test_pyexpat.py b/Lib/test/test_pyexpat.py index b911a20..9f63d4e 100644 --- a/Lib/test/test_pyexpat.py +++ b/Lib/test/test_pyexpat.py @@ -228,6 +228,17 @@ class ParseTest(unittest.TestCase): finally: test_support.unlink(test_support.TESTFN) + def test_parse_again(self): + parser = expat.ParserCreate() + file = StringIO.StringIO(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): @@ -246,6 +246,11 @@ Library - Issue #19286: Directories in ``package_data`` are no longer added to the filelist, preventing failure outlined in the ticket. +- 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) + Tools/Demos ----------- diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index 8de3fb1..a95c388 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -976,7 +976,7 @@ xmlparse_ParseFile(xmlparseobject *self, PyObject *f) 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); |