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:
Brett Cannon 2007-09-07 04:18:30 +00:00
parent 68a6da99e6
commit 1e534b5425
11 changed files with 66 additions and 49 deletions

View file

@ -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;