mirror of https://github.com/python/cpython
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.
This commit is contained in:
parent
e38051db87
commit
2456a3c02a
|
@ -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()
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue