STINNER Victor added the comment:

Naoki: "On the other hand, PyCFunction may calls method of extension module, 
and it can cause recursive call. So I think PyCFunction_*Call* methods calling 
function pointer it has (e.g. _PyCFunction_FastCallKeywords) should call 
Py_EnterRecursiveCall()."

In Python 3.5, C functions are only calls inside Py_EnterRecursiveCall() if 
calls from PyObject_Call(). There are many other ways to call C functions which 
don't use Py_EnterRecursiveCall(). Examples:

* call_function() => call the C function
* call_function() => PyCFunction_Call() => call the C function
* call_function() => do_call() => PyCFunction_Call() => call the C function
* ext_do_call() => PyCFunction_Call() => call the C function

call_function() and do_call() have a special case for PyCFunction, otherwise 
they call the generic PyObject_Call() which uses Py_EnterRecursiveCall().

I agree that calling C functions with Py_EnterRecursiveCall() would help to 
prevent stack overflow crashs.

Attached enter_recursive_call.patch patch:

* _PyMethodDef_RawFastCallDict() (internal helper of 
_PyCFunction_FastCallDict()) and _PyCFunction_FastCallKeywords() now use 
Py_EnterRecursiveCall()
* _PyObject_FastCallKeywords(): move Py_EnterRecursiveCall() closer to the 
final call to simplify error handling
* Modify _PyObject_FastCallDict() to not call _PyFunction_FastCallDict() nor 
_PyCFunction_FastCallDict() inside Py_EnterRecursiveCall(), since these 
functions already use Py_EnterRecursiveCall() internally

----------
keywords: +patch
Added file: http://bugs.python.org/file46327/enter_recursive_call.patch

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue29306>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to