Kaydet (Commit) df44ab7b authored tarafından Tim Peters's avatar Tim Peters

_hotshot hotshot_profiler(): If write_header() returned

an error code, this let `self` leak.  This is a disaster
on Windows, since `self` already points to a newly-opened
file object, and it was impossible for Python code to
close the thing since the only reference to it was in a
blob of leaked C memory.

test_hotshot test_bad_sys_path():  This new test provoked
the C bug above.  This test passed, but left an open
"@test" file behind, which caused a massive cascade of
bogus test failures in later, unrelated tests on Windows.
Changed the test code to remove the @test file it leaves
behind, which relies on the change above to close that
file first.
üst 516999e6
...@@ -109,17 +109,20 @@ class HotShotTestCase(unittest.TestCase): ...@@ -109,17 +109,20 @@ class HotShotTestCase(unittest.TestCase):
def test_bad_sys_path(self): def test_bad_sys_path(self):
import sys import sys
import os
orig_path = sys.path orig_path = sys.path
coverage = hotshot._hotshot.coverage coverage = hotshot._hotshot.coverage
try: try:
# verify we require a list for sys.path # verify we require a list for sys.path
sys.path = 'abc' sys.path = 'abc'
self.assertRaises(RuntimeError, coverage, test_support.TESTFN) self.assertRaises(RuntimeError, coverage, test_support.TESTFN)
# verify sys.path exists # verify that we require sys.path exists
del sys.path del sys.path
self.assertRaises(RuntimeError, coverage, test_support.TESTFN) self.assertRaises(RuntimeError, coverage, test_support.TESTFN)
finally: finally:
sys.path = orig_path sys.path = orig_path
if os.path.exists(test_support.TESTFN):
os.remove(test_support.TESTFN)
def test_main(): def test_main():
test_support.run_unittest(HotShotTestCase) test_support.run_unittest(HotShotTestCase)
......
...@@ -1525,9 +1525,11 @@ hotshot_profiler(PyObject *unused, PyObject *args) ...@@ -1525,9 +1525,11 @@ hotshot_profiler(PyObject *unused, PyObject *args)
calibrate(); calibrate();
calibrate(); calibrate();
} }
if (write_header(self)) if (write_header(self)) {
/* some error occurred, exception has been set */ /* some error occurred, exception has been set */
Py_DECREF(self);
self = NULL; self = NULL;
}
} }
return (PyObject *) self; return (PyObject *) self;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment