#4877: Fix a segfault in xml.parsers.expat while attempting to parse a closed file.

This commit is contained in:
Ezio Melotti 2011-04-11 03:44:28 +03:00
parent 7dfc874a48
commit 8b4367ec10
3 changed files with 27 additions and 27 deletions

View File

@ -6,6 +6,7 @@ import unittest
from xml.parsers import expat
from test import test_support
from test.test_support import sortdict, run_unittest
@ -217,6 +218,16 @@ class ParseTest(unittest.TestCase):
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):

View File

@ -51,11 +51,14 @@ Core and Builtins
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.

View File

@ -962,21 +962,15 @@ static PyObject *
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 @@ xmlparse_ParseFile(xmlparseobject *self, PyObject *f)
return PyErr_NoMemory();
}
if (fp) {
bytes_read = fread(buf, sizeof(char), BUF_SIZE, fp);
if (bytes_read < 0) {
PyErr_SetFromErrno(PyExc_IOError);
return NULL;
}
}
else {
bytes_read = readinst(buf, BUF_SIZE, readmethod);
if (bytes_read < 0) {
Py_XDECREF(readmethod);
return NULL;
}
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);