summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNed Deily <nad@acm.org>2014-03-27 23:44:06 (GMT)
committerNed Deily <nad@acm.org>2014-03-27 23:44:06 (GMT)
commit090eb1fd18f7cdd753b6fc9b60162491ee48f04e (patch)
tree09204f5b877338f0e58f5b012d6f6ef113ec510d
parentdccfa13cdbdb618da3f45f1023c6626be6abb056 (diff)
parente7d532fbc9c13e00b1e5c6c0db2dba31d1212de7 (diff)
downloadcpython-090eb1fd18f7cdd753b6fc9b60162491ee48f04e.zip
cpython-090eb1fd18f7cdd753b6fc9b60162491ee48f04e.tar.gz
cpython-090eb1fd18f7cdd753b6fc9b60162491ee48f04e.tar.bz2
Issue #6676: merge from 3.4
-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 3d88d85..cb8ab65 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 8ef3917..95a614b 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 3d62992..c27ba83 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -119,6 +119,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 a71ecc5..97f2b56 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);