mirror of
https://github.com/python/cpython.git
synced 2025-08-04 17:08:35 +00:00
bpo-44348: BaseException deallocator uses trashcan (GH-28190)
The deallocator function of the BaseException type now uses the trashcan mecanism to prevent stack overflow. For example, when a RecursionError instance is raised, it can be linked to another RecursionError through the __context__ attribute or the __traceback__ attribute, and then a chain of exceptions is created. When the chain is destroyed, nested deallocator function calls can crash with a stack overflow if the chain is too long compared to the available stack memory.
This commit is contained in:
parent
979336de34
commit
fb305092a5
2 changed files with 14 additions and 1 deletions
|
@ -0,0 +1,8 @@
|
|||
The deallocator function of the :exc:`BaseException` type now uses the
|
||||
trashcan mecanism to prevent stack overflow. For example, when a
|
||||
:exc:`RecursionError` instance is raised, it can be linked to another
|
||||
RecursionError through the ``__context__`` attribute or the
|
||||
``__traceback__`` attribute, and then a chain of exceptions is created. When
|
||||
the chain is destroyed, nested deallocator function calls can crash with a
|
||||
stack overflow if the chain is too long compared to the available stack
|
||||
memory. Patch by Victor Stinner.
|
|
@ -89,9 +89,14 @@ BaseException_clear(PyBaseExceptionObject *self)
|
|||
static void
|
||||
BaseException_dealloc(PyBaseExceptionObject *self)
|
||||
{
|
||||
_PyObject_GC_UNTRACK(self);
|
||||
PyObject_GC_UnTrack(self);
|
||||
// bpo-44348: The trashcan mecanism prevents stack overflow when deleting
|
||||
// long chains of exceptions. For example, exceptions can be chained
|
||||
// through the __context__ attributes or the __traceback__ attribute.
|
||||
Py_TRASHCAN_BEGIN(self, BaseException_dealloc)
|
||||
BaseException_clear(self);
|
||||
Py_TYPE(self)->tp_free((PyObject *)self);
|
||||
Py_TRASHCAN_END
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue