summaryrefslogtreecommitdiffstats
path: root/Modules/_ctypes
diff options
context:
space:
mode:
authorThomas Heller <theller@ctypes.org>2006-07-10 09:10:28 (GMT)
committerThomas Heller <theller@ctypes.org>2006-07-10 09:10:28 (GMT)
commitdda068dee1937d0dd144568a83e2a47e5c26f9a2 (patch)
treec9d34a4afc654d7cb4041bb35f98eb0a6ae2d0bb /Modules/_ctypes
parent70e8e877509d643150ed6fd27bce29523f169690 (diff)
downloadcpython-dda068dee1937d0dd144568a83e2a47e5c26f9a2.zip
cpython-dda068dee1937d0dd144568a83e2a47e5c26f9a2.tar.gz
cpython-dda068dee1937d0dd144568a83e2a47e5c26f9a2.tar.bz2
Fix bug #1518190: accept any integer or long value in the
ctypes.c_void_p constructor.
Diffstat (limited to 'Modules/_ctypes')
-rw-r--r--Modules/_ctypes/cfield.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c
index c5895f0..b147ae2 100644
--- a/Modules/_ctypes/cfield.c
+++ b/Modules/_ctypes/cfield.c
@@ -1486,16 +1486,27 @@ P_set(void *ptr, PyObject *value, unsigned size)
*(void **)ptr = NULL;
_RET(value);
}
-
- v = PyLong_AsVoidPtr(value);
- if (PyErr_Occurred()) {
- /* prevent the SystemError: bad argument to internal function */
- if (!PyInt_Check(value) && !PyLong_Check(value)) {
- PyErr_SetString(PyExc_TypeError,
- "cannot be converted to pointer");
- }
+
+ if (!PyInt_Check(value) && !PyLong_Check(value)) {
+ PyErr_SetString(PyExc_TypeError,
+ "cannot be converted to pointer");
return NULL;
}
+
+#if SIZEOF_VOID_P <= SIZEOF_LONG
+ v = (void *)PyInt_AsUnsignedLongMask(value);
+#else
+#ifndef HAVE_LONG_LONG
+# error "PyLong_AsVoidPtr: sizeof(void*) > sizeof(long), but no long long"
+#elif SIZEOF_LONG_LONG < SIZEOF_VOID_P
+# error "PyLong_AsVoidPtr: sizeof(PY_LONG_LONG) < sizeof(void*)"
+#endif
+ v = (void *)PyInt_AsUnsignedLongLongMask(value);
+#endif
+
+ if (PyErr_Occurred())
+ return NULL;
+
*(void **)ptr = v;
_RET(value);
}