Commit b693e9fc authored by Ned Deily's avatar Ned Deily

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)
parent c727533c
...@@ -103,6 +103,10 @@ The :mod:`xml.parsers.expat` module contains two functions: ...@@ -103,6 +103,10 @@ The :mod:`xml.parsers.expat` module contains two functions:
http://www.python.org/ns/ elem1 http://www.python.org/ns/ elem1
elem2 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:: .. seealso::
...@@ -122,7 +126,9 @@ XMLParser Objects ...@@ -122,7 +126,9 @@ XMLParser Objects
Parses the contents of the string *data*, calling the appropriate handler 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 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) .. method:: xmlparser.ParseFile(file)
......
...@@ -228,6 +228,17 @@ class ParseTest(unittest.TestCase): ...@@ -228,6 +228,17 @@ class ParseTest(unittest.TestCase):
finally: finally:
test_support.unlink(test_support.TESTFN) 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): class NamespaceSeparatorTest(unittest.TestCase):
def test_legal(self): def test_legal(self):
......
...@@ -246,6 +246,11 @@ Library ...@@ -246,6 +246,11 @@ Library
- Issue #19286: Directories in ``package_data`` are no longer added to - Issue #19286: Directories in ``package_data`` are no longer added to
the filelist, preventing failure outlined in the ticket. 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 Tools/Demos
----------- -----------
......
...@@ -976,7 +976,7 @@ xmlparse_ParseFile(xmlparseobject *self, PyObject *f) ...@@ -976,7 +976,7 @@ xmlparse_ParseFile(xmlparseobject *self, PyObject *f)
void *buf = XML_GetBuffer(self->itself, BUF_SIZE); void *buf = XML_GetBuffer(self->itself, BUF_SIZE);
if (buf == NULL) { if (buf == NULL) {
Py_XDECREF(readmethod); Py_XDECREF(readmethod);
return PyErr_NoMemory(); return get_parse_result(self, 0);
} }
bytes_read = readinst(buf, BUF_SIZE, readmethod); bytes_read = readinst(buf, BUF_SIZE, readmethod);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment