summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmaury Forgeot d'Arc <amauryfa@gmail.com>2008-12-15 22:16:00 (GMT)
committerAmaury Forgeot d'Arc <amauryfa@gmail.com>2008-12-15 22:16:00 (GMT)
commit360d8cfc9dc0c2c1e2ecb0dfc4cc340efceca017 (patch)
tree8b967494db33d3bd67b18a0970718a8190d660c0
parent3fced65aa36f9b5f384f19418430c2dd20e044d6 (diff)
downloadcpython-360d8cfc9dc0c2c1e2ecb0dfc4cc340efceca017.zip
cpython-360d8cfc9dc0c2c1e2ecb0dfc4cc340efceca017.tar.gz
cpython-360d8cfc9dc0c2c1e2ecb0dfc4cc340efceca017.tar.bz2
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. ........
-rw-r--r--Lib/test/test_hotshot.py6
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/_hotshot.c18
3 files changed, 17 insertions, 10 deletions
diff --git a/Lib/test/test_hotshot.py b/Lib/test/test_hotshot.py
index 2751b3f..35ca6aa 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 a3da314..43f5ce7 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 4c66e2a..a36cd50 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;
}