diff -r 6fb033af9310 Lib/test/test_pyexpat.py --- a/Lib/test/test_pyexpat.py Fri Apr 08 11:40:38 2011 +0100 +++ b/Lib/test/test_pyexpat.py Fri Apr 08 10:36:16 2011 -0700 @@ -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 -r 6fb033af9310 Modules/pyexpat.c --- a/Modules/pyexpat.c Fri Apr 08 11:40:38 2011 +0100 +++ b/Modules/pyexpat.c Fri Apr 08 10:36:16 2011 -0700 @@ -967,6 +967,12 @@ if (PyFile_Check(f)) { fp = PyFile_AsFile(f); + if (!fp) { + PyErr_Clear(); + PyErr_SetString(PyExc_ValueError, + "attempting to parse a closed file"); + return NULL; + } } else { fp = NULL;