From: Thomas A Caswell Date: Thu, 29 Aug 2019 16:30:04 +0000 (-0400) Subject: bpo-37933: Fix faulthandler.cancel_dump_traceback_later() (GH-15440) X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e278335a6eb049e6028db9a8dcb8baac6cb365ee;p=python bpo-37933: Fix faulthandler.cancel_dump_traceback_later() (GH-15440) Fix faulthandler.cancel_dump_traceback_later() call if cancel_dump_traceback_later() was not called previously. --- diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py index 1cf20db1c7..b1aa8c3228 100644 --- a/Lib/test/test_faulthandler.py +++ b/Lib/test/test_faulthandler.py @@ -817,6 +817,17 @@ class FaultHandlerTests(unittest.TestCase): self.assertEqual(output, []) self.assertEqual(exitcode, 0xC0000005) + def test_cancel_later_without_dump_traceback_later(self): + # bpo-37933: Calling cancel_dump_traceback_later() + # without dump_traceback_later() must not segfault. + code = dedent(""" + import faulthandler + faulthandler.cancel_dump_traceback_later() + """) + output, exitcode = self.get_output(code) + self.assertEqual(output, []) + self.assertEqual(exitcode, 0) + if __name__ == "__main__": unittest.main() diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index 35e7b34c29..011ab5fa28 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -631,6 +631,11 @@ faulthandler_thread(void *unused) static void cancel_dump_traceback_later(void) { + /* If not scheduled, nothing to cancel */ + if (!thread.cancel_event) { + return; + } + /* Notify cancellation */ PyThread_release_lock(thread.cancel_event);