aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorNed Deily <nad@acm.org>2014-03-27 16:39:58 -0700
committerNed Deily <nad@acm.org>2014-03-27 16:39:58 -0700
commite7d532fbc9c13e00b1e5c6c0db2dba31d1212de7 (patch)
tree2bd2f23bfd2bcc454c47ff4dfad438b2e9114af1
parent2542b66bb04e5634410205f54523987dce9e5bf7 (diff)
downloadcpython-e7d532fbc9c13e00b1e5c6c0db2dba31d1212de7.tar.gz
cpython-e7d532fbc9c13e00b1e5c6c0db2dba31d1212de7.zip
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)
-rw-r--r--Doc/library/pyexpat.rst9
-rw-r--r--Lib/test/test_pyexpat.py12
-rw-r--r--Misc/NEWS5
-rw-r--r--Modules/pyexpat.c2
4 files changed, 26 insertions, 2 deletions
diff --git a/Doc/library/pyexpat.rst b/Doc/library/pyexpat.rst
index 3d88d85d1cc..cb8ab65d644 100644
--- a/Doc/library/pyexpat.rst
+++ b/Doc/library/pyexpat.rst
@@ -100,6 +100,11 @@ 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::
@@ -119,7 +124,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 8ef391791f7..95a614bb9b7 100644
--- a/Lib/test/test_pyexpat.py
+++ b/Lib/test/test_pyexpat.py
@@ -236,6 +236,18 @@ class ParseTest(unittest.TestCase):
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 --git a/Misc/NEWS b/Misc/NEWS
index 10ddd9a4bbe..5240f6997ff 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -89,6 +89,11 @@ Library
- 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 --git a/Modules/pyexpat.c b/Modules/pyexpat.c
index a71ecc530e4..97f2b567717 100644
--- a/Modules/pyexpat.c
+++ b/Modules/pyexpat.c
@@ -908,7 +908,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);