]> granicus.if.org Git - python/commitdiff
_hotshot hotshot_profiler(): If write_header() returned
authorTim Peters <tim.peters@gmail.com>
Tue, 7 Mar 2006 23:53:32 +0000 (23:53 +0000)
committerTim Peters <tim.peters@gmail.com>
Tue, 7 Mar 2006 23:53:32 +0000 (23:53 +0000)
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.

Lib/test/test_hotshot.py
Modules/_hotshot.c

index 4618439867d748ba23e67a0deb1ace921eb91833..2751b3ffd490d5100196138208ddc4f9761f6c18 100644 (file)
@@ -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)
index 64dfa9130177e5df8928c9ec8f45ad828b0d1173..d5b4cde8f9e5830fc60274a6a53b8535b6a53d11 100644 (file)
@@ -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;
 }