#3954: Fix error handling code in _hotshot.logreader

Will port to 2.6. hotshot was deleted from python 3.
This commit is contained in:
Amaury Forgeot d'Arc 2008-12-15 21:47:57 +00:00
parent 68060013ea
commit 31949b9108
3 changed files with 17 additions and 10 deletions

View File

@ -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)

View File

@ -74,6 +74,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.

View File

@ -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;
}