mirror of https://github.com/python/cpython
_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.
This commit is contained in:
parent
516999e6e2
commit
df44ab7b1c
|
@ -109,17 +109,20 @@ class HotShotTestCase(unittest.TestCase):
|
|||
|
||||
def test_bad_sys_path(self):
|
||||
import sys
|
||||
import os
|
||||
orig_path = sys.path
|
||||
coverage = hotshot._hotshot.coverage
|
||||
try:
|
||||
# verify we require a list for sys.path
|
||||
sys.path = 'abc'
|
||||
self.assertRaises(RuntimeError, coverage, test_support.TESTFN)
|
||||
# verify sys.path exists
|
||||
# verify that we require sys.path exists
|
||||
del sys.path
|
||||
self.assertRaises(RuntimeError, coverage, test_support.TESTFN)
|
||||
finally:
|
||||
sys.path = orig_path
|
||||
if os.path.exists(test_support.TESTFN):
|
||||
os.remove(test_support.TESTFN)
|
||||
|
||||
def test_main():
|
||||
test_support.run_unittest(HotShotTestCase)
|
||||
|
|
|
@ -1525,9 +1525,11 @@ hotshot_profiler(PyObject *unused, PyObject *args)
|
|||
calibrate();
|
||||
calibrate();
|
||||
}
|
||||
if (write_header(self))
|
||||
if (write_header(self)) {
|
||||
/* some error occurred, exception has been set */
|
||||
Py_DECREF(self);
|
||||
self = NULL;
|
||||
}
|
||||
}
|
||||
return (PyObject *) self;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue