mirror of
https://github.com/python/cpython.git
synced 2025-08-01 07:33:08 +00:00
Fix a crasher where Python code managed to infinitely recurse in C code without
ever going back out to Python code in PyObject_Call(). Required introducing a static RuntimeError instance so that normalizing an exception there is no reliance on a recursive call that would put the exception system over the recursion check itself.
This commit is contained in:
parent
68a6da99e6
commit
1e534b5425
11 changed files with 66 additions and 49 deletions
|
@ -4854,16 +4854,7 @@ slot_tp_call(PyObject *self, PyObject *args, PyObject *kwds)
|
|||
if (meth == NULL)
|
||||
return NULL;
|
||||
|
||||
/* PyObject_Call() will end up calling slot_tp_call() again if
|
||||
the object returned for __call__ has __call__ itself defined
|
||||
upon it. This can be an infinite recursion if you set
|
||||
__call__ in a class to an instance of it. */
|
||||
if (Py_EnterRecursiveCall(" in __call__")) {
|
||||
Py_DECREF(meth);
|
||||
return NULL;
|
||||
}
|
||||
res = PyObject_Call(meth, args, kwds);
|
||||
Py_LeaveRecursiveCall();
|
||||
|
||||
Py_DECREF(meth);
|
||||
return res;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue