From: Antoine Pitrou Date: Mon, 15 Apr 2013 19:20:14 +0000 (+0200) Subject: Issue #17703: Fix a regression where an illegal use of Py_DECREF() after interpreter... X-Git-Tag: v2.7.5~60 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=108d1b4a7962a7777b7fb6108f12df619ea9218b;p=thirdparty%2FPython%2Fcpython.git 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 1ba33eb6c1c1..afbc68dc04e9 100644 --- a/Include/object.h +++ b/Include/object.h @@ -984,16 +984,22 @@ PyAPI_FUNC(void) _PyTrash_thread_destroy_chain(void); #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 d723cb59919a..3ccdb10bfa52 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -17,6 +17,9 @@ Build 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.