]> granicus.if.org Git - python/commitdiff
Merged revisions 54248 via svnmerge from
authorThomas Heller <theller@ctypes.org>
Fri, 9 Mar 2007 20:48:57 +0000 (20:48 +0000)
committerThomas Heller <theller@ctypes.org>
Fri, 9 Mar 2007 20:48:57 +0000 (20:48 +0000)
svn+ssh://pythondev@svn.python.org/python/trunk/Lib/ctypes

........
  r54248 | thomas.heller | 2007-03-09 21:39:22 +0100 (Fr, 09 Mär 2007) | 7 lines

  Bug #1651235: When a tuple was passed to a ctypes function call,
  Python would crash instead of raising an error.

  The crash was caused by a section of code that should have been
  removed long ago, at that time ctypes had other ways to pass
  parameters to function calls.
........

Lib/ctypes/test/test_functions.py
Misc/NEWS
Modules/_ctypes/_ctypes.c

index 759aea7eeeef545a34f2e7afcfed7c1173ce7e06..12bd59c4d45fe8f5247eb4b6c1516875106c9a18 100644 (file)
@@ -21,7 +21,9 @@ if sys.platform == "win32":
 
 class POINT(Structure):
     _fields_ = [("x", c_int), ("y", c_int)]
-
+class RECT(Structure):
+    _fields_ = [("left", c_int), ("top", c_int),
+                ("right", c_int), ("bottom", c_int)]
 class FunctionTestCase(unittest.TestCase):
 
     def test_mro(self):
@@ -379,5 +381,15 @@ class FunctionTestCase(unittest.TestCase):
             self.failUnlessEqual((s8i.a, s8i.b, s8i.c, s8i.d, s8i.e, s8i.f, s8i.g, s8i.h),
                                  (9*2, 8*3, 7*4, 6*5, 5*6, 4*7, 3*8, 2*9))
 
+    def test_sf1651235(self):
+        # see http://www.python.org/sf/1651235
+
+        proto = CFUNCTYPE(c_int, RECT, POINT)
+        def callback(*args):
+            return 0
+
+        callback = proto(callback)
+        self.failUnlessRaises(ArgumentError, lambda: callback((1, 2, 3, 4), POINT()))
+
 if __name__ == '__main__':
     unittest.main()
index a5b3fc7998e122fce70a75c54bcc3a93b5c34d2b..3c0c34bd0b977b496f1ae2837fd1beedeadd00e6 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -196,6 +196,8 @@ Extension Modules
 
 Library
 -------
+- Bug #1651235: When a tuple was passed to a ctypes function call,
+  Python would crash instead of raising an error.
 
 - Fix bug #1646630: ctypes.string_at(buf, 0) and ctypes.wstring_at(buf, 0)
   returned string up to the first NUL character.
index 69d3157bcfacc54829ce69fdee755d0e949e6dfa..53064562e1b96bb4dbabf02ee419bd5df4d4d080 100644 (file)
@@ -339,24 +339,6 @@ CDataType_from_param(PyObject *type, PyObject *value)
                             ((PyTypeObject *)type)->tp_name, ob_name);
                return NULL;
        }
-#if 1
-/* XXX Remove this section ??? */
-       /* tuple returned by byref: */
-       /* ('i', addr, obj) */
-       if (PyTuple_Check(value)) {
-               PyObject *ob;
-               StgDictObject *dict;
-
-               dict = PyType_stgdict(type);
-               ob = PyTuple_GetItem(value, 2);
-               if (dict && ob &&
-                   0 == PyObject_IsInstance(value, dict->proto)) {
-                       Py_INCREF(value);
-                       return value;
-               }
-       }
-/* ... and leave the rest */
-#endif
 
        as_parameter = PyObject_GetAttrString(value, "_as_parameter_");
        if (as_parameter) {