Message79398
In Python 2.5.4 built from unmodified source:
showard@showardlt:~/src/Python-2.5.4$ ./python
Python 2.5.4 (r254:67916, Jan 7 2009, 20:28:41)
[GCC 4.2.4 (Ubuntu 4.2.4-1ubuntu3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from xml.parsers import expat
>>> f=open('/tmp/foo')
>>> p=expat.ParserCreate()
>>> f.close()
>>> p.ParseFile(f)
Segmentation fault
The error is in the control flow in xmlparse_ParseFile()
(Modules/pyexpat.c:1000). When passed a real file object that's been
closed, PyFile_Check() returns true, but then PyFile_AsFile() returns 0
(since f_fp on the file object is set to zero when the file is closed).
So the local 'fp' is set to 0, and 'readmethod' is left as NULL. The
conditional at 1033 then fails, and the call to readinst() at 1041
passes readmethod=NULL, leading eventually to a segfault in
PyObject_Call at Objects/abstract.c:1860.
I think it's present in 2.6 as well, but I'm not sure. It seems to have
been fixed by chance in 3.0 because Guido removed the first branch in
xmlparse_ParseFile altogether in an unrelated change a while ago.
The attached patch simply checks for fp == 0 and raises an exception. I
don't know if it's the proper solution but you get the idea.
Built with the attached patch:
showard@showardlt:~/src/Python-2.5.4$ ./python
Python 2.5.4 (r254:67916, Jan 7 2009, 20:28:41)
[GCC 4.2.4 (Ubuntu 4.2.4-1ubuntu3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from xml.parsers import expat
>>> f=open('/tmp/foo')
>>> p=expat.ParserCreate()
>>> f.close()
>>> p.ParseFile(f)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: attempting to parse closed file |
|
Date |
User |
Action |
Args |
2009-01-08 05:01:16 | showard | set | recipients:
+ showard |
2009-01-08 05:01:16 | showard | set | messageid: <1231390876.07.0.554090447949.issue4877@psf.upfronthosting.co.za> |
2009-01-08 05:01:13 | showard | link | issue4877 messages |
2009-01-08 05:01:12 | showard | create | |
|