Commit 0f0e4ebd authored by Thomas Heller's avatar Thomas Heller

ctypes callback functions only support 'fundamental' result types.

Check this and raise an error when something else is used - before
this change ctypes would hang or crash when such a callback was
called.  This is a partial fix for #1574584.

Backported from trunk.
parent 8835a024
...@@ -101,6 +101,19 @@ class Callbacks(unittest.TestCase): ...@@ -101,6 +101,19 @@ class Callbacks(unittest.TestCase):
after = grc(o) after = grc(o)
self.failUnlessEqual((after, o), (before, o)) self.failUnlessEqual((after, o), (before, o))
def test_unsupported_restype_1(self):
# Only "fundamental" result types are supported for callback
# functions, the type must have a non-NULL stgdict->setfunc.
# POINTER(c_double), for example, is not supported.
prototype = self.functype.im_func(POINTER(c_double))
# The type is checked when the prototype is called
self.assertRaises(TypeError, prototype, lambda: None)
def test_unsupported_restype_2(self):
prototype = self.functype.im_func(object)
self.assertRaises(TypeError, prototype, lambda: None)
try: try:
WINFUNCTYPE WINFUNCTYPE
except NameError: except NameError:
......
...@@ -75,6 +75,10 @@ Extension Modules ...@@ -75,6 +75,10 @@ Extension Modules
Library Library
------- -------
- ctypes callback functions only support 'fundamental' data types as
result type. Raise an error when something else is used. This is a
partial fix for Bug #1574584.
- Bug #813342: Start the IDLE subprocess with -Qnew if the parent - Bug #813342: Start the IDLE subprocess with -Qnew if the parent
is started with that option. is started with that option.
......
...@@ -293,8 +293,11 @@ ffi_info *AllocFunctionCallback(PyObject *callable, ...@@ -293,8 +293,11 @@ ffi_info *AllocFunctionCallback(PyObject *callable,
p->restype = &ffi_type_void; p->restype = &ffi_type_void;
} else { } else {
StgDictObject *dict = PyType_stgdict(restype); StgDictObject *dict = PyType_stgdict(restype);
if (dict == NULL) if (dict == NULL || dict->setfunc == NULL) {
PyErr_SetString(PyExc_TypeError,
"invalid result type for callback function");
goto error; goto error;
}
p->setfunc = dict->setfunc; p->setfunc = dict->setfunc;
p->restype = &dict->ffi_type_pointer; p->restype = &dict->ffi_type_pointer;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment