]> granicus.if.org Git - python/commitdiff
ctypes callback functions only support 'fundamental' result types.
authorThomas Heller <theller@ctypes.org>
Tue, 17 Oct 2006 19:41:10 +0000 (19:41 +0000)
committerThomas Heller <theller@ctypes.org>
Tue, 17 Oct 2006 19:41:10 +0000 (19:41 +0000)
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.

Lib/ctypes/test/test_callbacks.py
Misc/NEWS
Modules/_ctypes/callbacks.c

index 9d96a5445e244c1b5a40b9ded358f558ab6e3da2..f47fc37b3f025089b30db505dc3034ad5a400a60 100644 (file)
@@ -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:
index 2bdbbc4d4b7981dbe6f5c734c13b7c4864b83ac9..7313802399a23394628c1b6849c900f2b2236238 100644 (file)
--- 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.
 
index c8e669a86e67bc6e6f2855169361e4097b951a17..e332f00e8c7279e2b52154307fb910b2b9a291c5 100644 (file)
@@ -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;
        }