summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas A Caswell <tcaswell@gmail.com>2019-08-29 16:30:04 (GMT)
committerVictor Stinner <vstinner@redhat.com>2019-08-29 16:30:04 (GMT)
commite278335a6eb049e6028db9a8dcb8baac6cb365ee (patch)
tree07f82d9cd0ba01c8709a6a3697047cfa8f7ff44c
parent88ea166dadb8aeb34541a0a464662dea222629e5 (diff)
downloadcpython-e278335a6eb049e6028db9a8dcb8baac6cb365ee.zip
cpython-e278335a6eb049e6028db9a8dcb8baac6cb365ee.tar.gz
cpython-e278335a6eb049e6028db9a8dcb8baac6cb365ee.tar.bz2
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.
-rw-r--r--Lib/test/test_faulthandler.py11
-rw-r--r--Modules/faulthandler.c5
2 files changed, 16 insertions, 0 deletions
diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py
index 1cf20db..b1aa8c3 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 35e7b34..011ab5f 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);