mirror of
https://github.com/python/cpython.git
synced 2026-05-09 14:11:28 -04:00
gh-127870: Detect recursive calls in ctypes _as_parameter_ handling (#127872)
This commit is contained in:
@@ -198,8 +198,16 @@ class BasicWrapTestCase(unittest.TestCase):
|
||||
|
||||
a = A()
|
||||
a._as_parameter_ = a
|
||||
with self.assertRaises(RecursionError):
|
||||
c_int.from_param(a)
|
||||
for c_type in (
|
||||
ctypes.c_wchar_p,
|
||||
ctypes.c_char_p,
|
||||
ctypes.c_void_p,
|
||||
ctypes.c_int, # PyCSimpleType
|
||||
POINT, # CDataType
|
||||
):
|
||||
with self.subTest(c_type=c_type):
|
||||
with self.assertRaises(RecursionError):
|
||||
c_type.from_param(a)
|
||||
|
||||
|
||||
class AsParamWrapper:
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
Detect recursive calls in ctypes ``_as_parameter_`` handling.
|
||||
Patch by Victor Stinner.
|
||||
@@ -1052,8 +1052,13 @@ CDataType_from_param_impl(PyObject *type, PyTypeObject *cls, PyObject *value)
|
||||
return NULL;
|
||||
}
|
||||
if (as_parameter) {
|
||||
if (_Py_EnterRecursiveCall(" while processing _as_parameter_")) {
|
||||
Py_DECREF(as_parameter);
|
||||
return NULL;
|
||||
}
|
||||
value = CDataType_from_param_impl(type, cls, as_parameter);
|
||||
Py_DECREF(as_parameter);
|
||||
_Py_LeaveRecursiveCall();
|
||||
return value;
|
||||
}
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
@@ -1843,8 +1848,13 @@ c_wchar_p_from_param_impl(PyObject *type, PyTypeObject *cls, PyObject *value)
|
||||
return NULL;
|
||||
}
|
||||
if (as_parameter) {
|
||||
if (_Py_EnterRecursiveCall(" while processing _as_parameter_")) {
|
||||
Py_DECREF(as_parameter);
|
||||
return NULL;
|
||||
}
|
||||
value = c_wchar_p_from_param_impl(type, cls, as_parameter);
|
||||
Py_DECREF(as_parameter);
|
||||
_Py_LeaveRecursiveCall();
|
||||
return value;
|
||||
}
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
@@ -1927,8 +1937,13 @@ c_char_p_from_param_impl(PyObject *type, PyTypeObject *cls, PyObject *value)
|
||||
return NULL;
|
||||
}
|
||||
if (as_parameter) {
|
||||
if (_Py_EnterRecursiveCall(" while processing _as_parameter_")) {
|
||||
Py_DECREF(as_parameter);
|
||||
return NULL;
|
||||
}
|
||||
value = c_char_p_from_param_impl(type, cls, as_parameter);
|
||||
Py_DECREF(as_parameter);
|
||||
_Py_LeaveRecursiveCall();
|
||||
return value;
|
||||
}
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
@@ -2079,8 +2094,13 @@ c_void_p_from_param_impl(PyObject *type, PyTypeObject *cls, PyObject *value)
|
||||
return NULL;
|
||||
}
|
||||
if (as_parameter) {
|
||||
if (_Py_EnterRecursiveCall(" while processing _as_parameter_")) {
|
||||
Py_DECREF(as_parameter);
|
||||
return NULL;
|
||||
}
|
||||
value = c_void_p_from_param_impl(type, cls, as_parameter);
|
||||
Py_DECREF(as_parameter);
|
||||
_Py_LeaveRecursiveCall();
|
||||
return value;
|
||||
}
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
@@ -2447,9 +2467,9 @@ PyCSimpleType_from_param_impl(PyObject *type, PyTypeObject *cls,
|
||||
return NULL;
|
||||
}
|
||||
value = PyCSimpleType_from_param_impl(type, cls, as_parameter);
|
||||
_Py_LeaveRecursiveCall();
|
||||
Py_DECREF(as_parameter);
|
||||
Py_XDECREF(exc);
|
||||
_Py_LeaveRecursiveCall();
|
||||
return value;
|
||||
}
|
||||
if (exc) {
|
||||
|
||||
Reference in New Issue
Block a user