summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/ctypes/test/test_functions.py14
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/_ctypes/_ctypes.c18
3 files changed, 16 insertions, 19 deletions
diff --git a/Lib/ctypes/test/test_functions.py b/Lib/ctypes/test/test_functions.py
index 759aea7..12bd59c 100644
--- a/Lib/ctypes/test/test_functions.py
+++ b/Lib/ctypes/test/test_functions.py
@@ -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()
diff --git a/Misc/NEWS b/Misc/NEWS
index a98accd..ef54039 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -156,6 +156,9 @@ Core and builtins
Library
-------
+- Bug #1651235: When a tuple was passed to a ctypes function call,
+ Python would crash instead of raising an error.
+
- Bug #1646630: ctypes.string_at(buf, 0) and ctypes.wstring_at(buf, 0)
returned string up to the first NUL character.
diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
index 0a90b0a..38bdeee 100644
--- a/Modules/_ctypes/_ctypes.c
+++ b/Modules/_ctypes/_ctypes.c
@@ -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) {