summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Misc/NEWS.d/next/Library/2018-05-23-14-58-05.bpo-33623.wAw1cF.rst1
-rw-r--r--Modules/_asynciomodule.c8
2 files changed, 8 insertions, 1 deletions
diff --git a/Misc/NEWS.d/next/Library/2018-05-23-14-58-05.bpo-33623.wAw1cF.rst b/Misc/NEWS.d/next/Library/2018-05-23-14-58-05.bpo-33623.wAw1cF.rst
new file mode 100644
index 0000000..641874c
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2018-05-23-14-58-05.bpo-33623.wAw1cF.rst
@@ -0,0 +1 @@
+Fix possible SIGSGV when asyncio.Future is created in __del__
diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c
index 6d7249a..c4d1903 100644
--- a/Modules/_asynciomodule.c
+++ b/Modules/_asynciomodule.c
@@ -501,7 +501,13 @@ future_init(FutureObj *fut, PyObject *loop)
if (is_true < 0) {
return -1;
}
- if (is_true) {
+ if (is_true && !_Py_IsFinalizing()) {
+ /* Only try to capture the traceback if the interpreter is not being
+ finalized. The original motivation to add a `_Py_IsFinalizing()`
+ call was to prevent SIGSEGV when a Future is created in a __del__
+ method, which is called during the interpreter shutdown and the
+ traceback module is already unloaded.
+ */
fut->fut_source_tb = _PyObject_CallNoArg(traceback_extract_stack);
if (fut->fut_source_tb == NULL) {
return -1;