From: Amaury Forgeot d'Arc Date: Mon, 15 Dec 2008 22:16:00 +0000 (+0000) Subject: Merged revisions 67797 via svnmerge from X-Git-Tag: v2.6.2c1~323 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=360d8cfc9dc0c2c1e2ecb0dfc4cc340efceca017;p=python Merged revisions 67797 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r67797 | amaury.forgeotdarc | 2008-12-15 22:47:57 +0100 (Mon, 15 Dec 2008) | 4 lines #3954: Fix error handling code in _hotshot.logreader Will port to 2.6. hotshot was deleted from python 3. ........ --- diff --git a/Lib/test/test_hotshot.py b/Lib/test/test_hotshot.py index 2751b3ffd4..35ca6aa7f7 100644 --- a/Lib/test/test_hotshot.py +++ b/Lib/test/test_hotshot.py @@ -3,6 +3,8 @@ import hotshot.log import os import pprint import unittest +import _hotshot +import gc from test import test_support @@ -124,6 +126,10 @@ class HotShotTestCase(unittest.TestCase): if os.path.exists(test_support.TESTFN): os.remove(test_support.TESTFN) + def test_logreader_eof_error(self): + self.assertRaises((IOError, EOFError), _hotshot.logreader, ".") + gc.collect() + def test_main(): test_support.run_unittest(HotShotTestCase) diff --git a/Misc/NEWS b/Misc/NEWS index a3da314f86..43f5ce7143 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -32,6 +32,9 @@ Core and Builtins Library ------- +- Issue #3954: Fix a potential SystemError in _hotshot.logreader error + handling. + - Issue #4574: fix a crash in io.IncrementalNewlineDecoder when a carriage return encodes to more than one byte in the source encoding (e.g. UTF-16) and gets split on a chunk boundary. diff --git a/Modules/_hotshot.c b/Modules/_hotshot.c index 4c66e2a6a3..a36cd50f0f 100644 --- a/Modules/_hotshot.c +++ b/Modules/_hotshot.c @@ -1357,20 +1357,16 @@ hotshot_logreader(PyObject *unused, PyObject *args) self->logfp = fopen(filename, "rb"); if (self->logfp == NULL) { PyErr_SetFromErrnoWithFilename(PyExc_IOError, filename); - Py_DECREF(self); - self = NULL; - goto finally; + goto error; } self->info = PyDict_New(); - if (self->info == NULL) { - Py_DECREF(self); - goto finally; - } + if (self->info == NULL) + goto error; /* read initial info */ for (;;) { if ((c = fgetc(self->logfp)) == EOF) { eof_error(self); - break; + goto error; } if (c != WHAT_ADD_INFO) { ungetc(c, self->logfp); @@ -1383,13 +1379,15 @@ hotshot_logreader(PyObject *unused, PyObject *args) else PyErr_SetString(PyExc_RuntimeError, "unexpected error"); - break; + goto error; } } } } - finally: return (PyObject *) self; + error: + Py_DECREF(self); + return NULL; }