Commit 1ad576c2 authored by Thomas Heller's avatar Thomas Heller

Do not truncate 64-bit pointers to 32-bit integers.

Fixes SF #1703286, will backport to release25-maint.
parent 22ea0254
...@@ -58,6 +58,33 @@ class LoaderTest(unittest.TestCase): ...@@ -58,6 +58,33 @@ class LoaderTest(unittest.TestCase):
windll.LoadLibrary("coredll").GetModuleHandleW windll.LoadLibrary("coredll").GetModuleHandleW
WinDLL("coredll").GetModuleHandleW WinDLL("coredll").GetModuleHandleW
def test_1703286_A(self):
from _ctypes import LoadLibrary, FreeLibrary
# On winXP 64-bit, advapi32 loads at an address that does
# NOT fit into a 32-bit integer. FreeLibrary must be able
# to accept this address.
# These are tests for http://www.python.org/sf/1703286
handle = LoadLibrary("advapi32")
FreeLibrary(handle)
def test_1703286_B(self):
# Since on winXP 64-bit advapi32 loads like described
# above, the (arbitrarily selected) CloseEventLog function
# also has a high address. 'call_function' should accept
# addresses so large.
from _ctypes import call_function
advapi32 = windll.advapi32
# Calling CloseEventLog with a NULL argument should fail,
# but the call should not segfault or so.
self.failUnlessEqual(0, advapi32.CloseEventLog(None))
windll.kernel32.GetProcAddress.argtypes = c_void_p, c_char_p
windll.kernel32.GetProcAddress.restype = c_void_p
proc = windll.kernel32.GetProcAddress(advapi32._handle, "CloseEventLog")
self.failUnless(proc)
# This is the real test: call the function via 'call_function'
self.failUnlessEqual(0, call_function(proc, (None,)))
def test_load_ordinal_functions(self): def test_load_ordinal_functions(self):
import _ctypes_test import _ctypes_test
dll = WinDLL(_ctypes_test.__file__) dll = WinDLL(_ctypes_test.__file__)
......
...@@ -1128,10 +1128,10 @@ static char free_library_doc[] = ...@@ -1128,10 +1128,10 @@ static char free_library_doc[] =
Free the handle of an executable previously loaded by LoadLibrary.\n"; Free the handle of an executable previously loaded by LoadLibrary.\n";
static PyObject *free_library(PyObject *self, PyObject *args) static PyObject *free_library(PyObject *self, PyObject *args)
{ {
HMODULE hMod; void *hMod;
if (!PyArg_ParseTuple(args, "i:FreeLibrary", &hMod)) if (!PyArg_ParseTuple(args, PY_VOID_P_CODE ":FreeLibrary", &hMod))
return NULL; return NULL;
if (!FreeLibrary(hMod)) if (!FreeLibrary((HMODULE)hMod))
return PyErr_SetFromWindowsErr(GetLastError()); return PyErr_SetFromWindowsErr(GetLastError());
Py_INCREF(Py_None); Py_INCREF(Py_None);
return Py_None; return Py_None;
...@@ -1250,11 +1250,11 @@ static PyObject *py_dl_open(PyObject *self, PyObject *args) ...@@ -1250,11 +1250,11 @@ static PyObject *py_dl_open(PyObject *self, PyObject *args)
static PyObject *py_dl_close(PyObject *self, PyObject *args) static PyObject *py_dl_close(PyObject *self, PyObject *args)
{ {
int handle; void *handle;
if (!PyArg_ParseTuple(args, "i:dlclose", &handle)) if (!PyArg_ParseTuple(args, PY_VOID_P_CODE ":dlclose", &handle))
return NULL; return NULL;
if (dlclose((void*)handle)) { if (dlclose(handle)) {
PyErr_SetString(PyExc_OSError, PyErr_SetString(PyExc_OSError,
ctypes_dlerror()); ctypes_dlerror());
return NULL; return NULL;
...@@ -1266,10 +1266,10 @@ static PyObject *py_dl_close(PyObject *self, PyObject *args) ...@@ -1266,10 +1266,10 @@ static PyObject *py_dl_close(PyObject *self, PyObject *args)
static PyObject *py_dl_sym(PyObject *self, PyObject *args) static PyObject *py_dl_sym(PyObject *self, PyObject *args)
{ {
char *name; char *name;
int handle; void *handle;
void *ptr; void *ptr;
if (!PyArg_ParseTuple(args, "is:dlsym", &handle, &name)) if (!PyArg_ParseTuple(args, PY_VOID_P_CODE "s:dlsym", &handle, &name))
return NULL; return NULL;
ptr = ctypes_dlsym((void*)handle, name); ptr = ctypes_dlsym((void*)handle, name);
if (!ptr) { if (!ptr) {
...@@ -1277,7 +1277,7 @@ static PyObject *py_dl_sym(PyObject *self, PyObject *args) ...@@ -1277,7 +1277,7 @@ static PyObject *py_dl_sym(PyObject *self, PyObject *args)
ctypes_dlerror()); ctypes_dlerror());
return NULL; return NULL;
} }
return Py_BuildValue("i", ptr); return PyLong_FromVoidPtr(ptr);
} }
#endif #endif
...@@ -1289,12 +1289,12 @@ static PyObject *py_dl_sym(PyObject *self, PyObject *args) ...@@ -1289,12 +1289,12 @@ static PyObject *py_dl_sym(PyObject *self, PyObject *args)
static PyObject * static PyObject *
call_function(PyObject *self, PyObject *args) call_function(PyObject *self, PyObject *args)
{ {
int func; void *func;
PyObject *arguments; PyObject *arguments;
PyObject *result; PyObject *result;
if (!PyArg_ParseTuple(args, if (!PyArg_ParseTuple(args,
"iO!", PY_VOID_P_CODE "O!",
&func, &func,
&PyTuple_Type, &arguments)) &PyTuple_Type, &arguments))
return NULL; return NULL;
...@@ -1320,12 +1320,12 @@ call_function(PyObject *self, PyObject *args) ...@@ -1320,12 +1320,12 @@ call_function(PyObject *self, PyObject *args)
static PyObject * static PyObject *
call_cdeclfunction(PyObject *self, PyObject *args) call_cdeclfunction(PyObject *self, PyObject *args)
{ {
int func; void *func;
PyObject *arguments; PyObject *arguments;
PyObject *result; PyObject *result;
if (!PyArg_ParseTuple(args, if (!PyArg_ParseTuple(args,
"iO!", PY_VOID_P_CODE "O!",
&func, &func,
&PyTuple_Type, &arguments)) &PyTuple_Type, &arguments))
return NULL; return NULL;
......
...@@ -23,6 +23,12 @@ typedef int Py_ssize_t; ...@@ -23,6 +23,12 @@ typedef int Py_ssize_t;
#define PY_LONG_LONG LONG_LONG #define PY_LONG_LONG LONG_LONG
#endif #endif
#if SIZEOF_VOID_P == SIZEOF_LONG
#define PY_VOID_P_CODE "k"
#elif defined(HAVE_LONG_LONG) && (SIZEOF_VOID_P == SIZEOF_LONG_LONG)
#define PY_VOID_P_CODE "K"
#endif
typedef struct tagPyCArgObject PyCArgObject; typedef struct tagPyCArgObject PyCArgObject;
typedef struct tagCDataObject CDataObject; typedef struct tagCDataObject CDataObject;
typedef PyObject *(* GETFUNC)(void *, unsigned size); typedef PyObject *(* GETFUNC)(void *, unsigned size);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment