diff options
author | Thomas Heller <theller@ctypes.org> | 2006-10-17 19:41:10 +0000 |
---|---|---|
committer | Thomas Heller <theller@ctypes.org> | 2006-10-17 19:41:10 +0000 |
commit | dcbf64d34ddef32cb49ebbd19958ddd426cbdab6 (patch) | |
tree | 15f55f06acccbf966b1a11f362936629ce7ef295 | |
parent | ca362b6937aecf5177d832b3e44aa6697e6d5d9e (diff) | |
download | cpython-git-dcbf64d34ddef32cb49ebbd19958ddd426cbdab6.tar.gz |
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.
-rw-r--r-- | Lib/ctypes/test/test_callbacks.py | 13 | ||||
-rw-r--r-- | Misc/NEWS | 4 | ||||
-rw-r--r-- | Modules/_ctypes/callbacks.c | 7 |
3 files changed, 22 insertions, 2 deletions
diff --git a/Lib/ctypes/test/test_callbacks.py b/Lib/ctypes/test/test_callbacks.py index 9d96a5445e..f47fc37b3f 100644 --- a/Lib/ctypes/test/test_callbacks.py +++ b/Lib/ctypes/test/test_callbacks.py @@ -101,6 +101,19 @@ class Callbacks(unittest.TestCase): after = grc(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: WINFUNCTYPE except NameError: @@ -75,6 +75,10 @@ Extension Modules 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 is started with that option. diff --git a/Modules/_ctypes/callbacks.c b/Modules/_ctypes/callbacks.c index c8e669a86e..e332f00e8c 100644 --- a/Modules/_ctypes/callbacks.c +++ b/Modules/_ctypes/callbacks.c @@ -293,8 +293,11 @@ ffi_info *AllocFunctionCallback(PyObject *callable, p->restype = &ffi_type_void; } else { StgDictObject *dict = PyType_stgdict(restype); - if (dict == NULL) - goto error; + if (dict == NULL || dict->setfunc == NULL) { + PyErr_SetString(PyExc_TypeError, + "invalid result type for callback function"); + goto error; + } p->setfunc = dict->setfunc; p->restype = &dict->ffi_type_pointer; } |