Skip to content

Commit e278335

Browse files
tacaswellvstinner
authored andcommitted
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.
1 parent 88ea166 commit e278335

File tree

2 files changed

+16
-0
lines changed

2 files changed

+16
-0
lines changed

Lib/test/test_faulthandler.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -817,6 +817,17 @@ def test_disable_windows_exc_handler(self):
817817
self.assertEqual(output, [])
818818
self.assertEqual(exitcode, 0xC0000005)
819819

820+
def test_cancel_later_without_dump_traceback_later(self):
821+
# bpo-37933: Calling cancel_dump_traceback_later()
822+
# without dump_traceback_later() must not segfault.
823+
code = dedent("""
824+
import faulthandler
825+
faulthandler.cancel_dump_traceback_later()
826+
""")
827+
output, exitcode = self.get_output(code)
828+
self.assertEqual(output, [])
829+
self.assertEqual(exitcode, 0)
830+
820831

821832
if __name__ == "__main__":
822833
unittest.main()

Modules/faulthandler.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -631,6 +631,11 @@ faulthandler_thread(void *unused)
631631
static void
632632
cancel_dump_traceback_later(void)
633633
{
634+
/* If not scheduled, nothing to cancel */
635+
if (!thread.cancel_event) {
636+
return;
637+
}
638+
634639
/* Notify cancellation */
635640
PyThread_release_lock(thread.cancel_event);
636641

0 commit comments

Comments
 (0)