[Python-checkins] cpython (2.7): #4877: Fix a segfault in xml.parsers.expat while attempting to parse a closed
ezio.melotti
python-checkins at python.org
Mon Apr 11 02:45:55 CEST 2011
http://hg.python.org/cpython/rev/28705a7987c5
changeset: 69243:28705a7987c5
branch: 2.7
parent: 69239:dfc61dc14f59
user: Ezio Melotti
date: Mon Apr 11 03:44:28 2011 +0300
summary:
#4877: Fix a segfault in xml.parsers.expat while attempting to parse a closed file.
files:
Lib/test/test_pyexpat.py | 11 ++++++++
Misc/NEWS | 5 ++-
Modules/pyexpat.c | 38 ++++++++-------------------
3 files changed, 27 insertions(+), 27 deletions(-)
diff --git a/Lib/test/test_pyexpat.py b/Lib/test/test_pyexpat.py
--- a/Lib/test/test_pyexpat.py
+++ b/Lib/test/test_pyexpat.py
@@ -6,6 +6,7 @@
from xml.parsers import expat
+from test import test_support
from test.test_support import sortdict, run_unittest
@@ -217,6 +218,16 @@
self.assertEqual(op[15], "External entity ref: (None, u'entity.file', None)")
self.assertEqual(op[16], "End element: u'root'")
+ # Issue 4877: expat.ParseFile causes segfault on a closed file.
+ fp = open(test_support.TESTFN, 'wb')
+ try:
+ fp.close()
+ parser = expat.ParserCreate()
+ with self.assertRaises(ValueError):
+ parser.ParseFile(fp)
+ finally:
+ test_support.unlink(test_support.TESTFN)
+
class NamespaceSeparatorTest(unittest.TestCase):
def test_legal(self):
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -51,11 +51,14 @@
Library
-------
+- Issue #4877: Fix a segfault in xml.parsers.expat while attempting to parse
+ a closed file.
+
- Issue #8428: Fix a race condition in multiprocessing.Pool when terminating
worker processes: new processes would be spawned while the pool is being
shut down. Patch by Charles-François Natali.
-- Issue #7311: fix HTMLParser to accept non-ASCII attribute values.
+- Issue #7311: Fix HTMLParser to accept non-ASCII attribute values.
- Issue #10963: Ensure that subprocess.communicate() never raises EPIPE.
diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c
--- a/Modules/pyexpat.c
+++ b/Modules/pyexpat.c
@@ -962,21 +962,15 @@
xmlparse_ParseFile(xmlparseobject *self, PyObject *f)
{
int rv = 1;
- FILE *fp;
PyObject *readmethod = NULL;
- if (PyFile_Check(f)) {
- fp = PyFile_AsFile(f);
- }
- else {
- fp = NULL;
- readmethod = PyObject_GetAttrString(f, "read");
- if (readmethod == NULL) {
- PyErr_Clear();
- PyErr_SetString(PyExc_TypeError,
- "argument must have 'read' attribute");
- return NULL;
- }
+ readmethod = PyObject_GetAttrString(f, "read");
+ if (readmethod == NULL) {
+ PyErr_Clear();
+ PyErr_SetString(PyExc_TypeError,
+ "argument must have 'read' attribute");
+ return NULL;
+
}
for (;;) {
int bytes_read;
@@ -986,20 +980,12 @@
return PyErr_NoMemory();
}
- if (fp) {
- bytes_read = fread(buf, sizeof(char), BUF_SIZE, fp);
- if (bytes_read < 0) {
- PyErr_SetFromErrno(PyExc_IOError);
- return NULL;
- }
+ bytes_read = readinst(buf, BUF_SIZE, readmethod);
+ if (bytes_read < 0) {
+ Py_XDECREF(readmethod);
+ return NULL;
}
- else {
- bytes_read = readinst(buf, BUF_SIZE, readmethod);
- if (bytes_read < 0) {
- Py_XDECREF(readmethod);
- return NULL;
- }
- }
+
rv = XML_ParseBuffer(self->itself, bytes_read, bytes_read == 0);
if (PyErr_Occurred()) {
Py_XDECREF(readmethod);
--
Repository URL: http://hg.python.org/cpython
More information about the Python-checkins
mailing list