Issue #17703: Fix a regression where an illegal use of Py_DECREF() after interpreter finalization can cause a crash.
diff --git a/Include/object.h b/Include/object.h
index 1ba33eb..afbc68d 100644
--- a/Include/object.h
+++ b/Include/object.h
@@ -984,16 +984,22 @@
#define PyTrash_UNWIND_LEVEL 50
+/* Note the workaround for when the thread state is NULL (issue #17703) */
#define Py_TRASHCAN_SAFE_BEGIN(op) \
do { \
PyThreadState *_tstate = PyThreadState_GET(); \
- if (_tstate->trash_delete_nesting < PyTrash_UNWIND_LEVEL) { \
- ++_tstate->trash_delete_nesting;
+ if (!_tstate || \
+ _tstate->trash_delete_nesting < PyTrash_UNWIND_LEVEL) { \
+ if (_tstate) \
+ ++_tstate->trash_delete_nesting;
/* The body of the deallocator is here. */
#define Py_TRASHCAN_SAFE_END(op) \
- --_tstate->trash_delete_nesting; \
- if (_tstate->trash_delete_later && _tstate->trash_delete_nesting <= 0) \
- _PyTrash_thread_destroy_chain(); \
+ if (_tstate) { \
+ --_tstate->trash_delete_nesting; \
+ if (_tstate->trash_delete_later \
+ && _tstate->trash_delete_nesting <= 0) \
+ _PyTrash_thread_destroy_chain(); \
+ } \
} \
else \
_PyTrash_thread_deposit_object((PyObject*)op); \
diff --git a/Misc/NEWS b/Misc/NEWS
index d723cb5..3ccdb10 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -17,6 +17,9 @@
Core and Builtins
-----------------
+- Issue #17703: Fix a regression where an illegal use of Py_DECREF() after
+ interpreter finalization can cause a crash.
+
- Issue #16447: Fixed potential segmentation fault when setting __name__ on a
class.