diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py index 1cf20db1c7ff5c3..b1aa8c32284ba39 100644 --- a/Lib/test/test_faulthandler.py +++ b/Lib/test/test_faulthandler.py @@ -817,6 +817,17 @@ def test_disable_windows_exc_handler(self): 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 35e7b34c29ccd5d..011ab5fa28f2561 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);