summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Heller <theller@ctypes.org>2006-10-17 19:41:10 +0000
committerThomas Heller <theller@ctypes.org>2006-10-17 19:41:10 +0000
commitdcbf64d34ddef32cb49ebbd19958ddd426cbdab6 (patch)
tree15f55f06acccbf966b1a11f362936629ce7ef295
parentca362b6937aecf5177d832b3e44aa6697e6d5d9e (diff)
downloadcpython-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.py13
-rw-r--r--Misc/NEWS4
-rw-r--r--Modules/_ctypes/callbacks.c7
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:
diff --git a/Misc/NEWS b/Misc/NEWS
index 2bdbbc4d4b..7313802399 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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;
}