Fis issue5504: ctypes does now work with systems where mmap can't be
PROT_WRITE and PROT_EXEC.
This commit is contained in:
parent
6fe8c41e8f
commit
001d3a1d8a
|
@ -26,6 +26,9 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue5504 - ctypes should now work with systems where mmap can't be
|
||||||
|
PROT_WRITE and PROT_EXEC.
|
||||||
|
|
||||||
- Fix Issue8280 - urllib2's Request method will remove fragements in the url.
|
- Fix Issue8280 - urllib2's Request method will remove fragements in the url.
|
||||||
This is how it is supposed to work, wget and curl do the same. Previous
|
This is how it is supposed to work, wget and curl do the same. Previous
|
||||||
behavior was wrong.
|
behavior was wrong.
|
||||||
|
|
|
@ -3463,7 +3463,7 @@ PyCFuncPtr_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||||
self->callable = callable;
|
self->callable = callable;
|
||||||
|
|
||||||
self->thunk = thunk;
|
self->thunk = thunk;
|
||||||
*(void **)self->b_ptr = (void *)thunk->pcl;
|
*(void **)self->b_ptr = (void *)thunk->pcl_exec;
|
||||||
|
|
||||||
Py_INCREF((PyObject *)thunk); /* for KeepRef */
|
Py_INCREF((PyObject *)thunk); /* for KeepRef */
|
||||||
if (-1 == KeepRef((CDataObject *)self, 0, (PyObject *)thunk)) {
|
if (-1 == KeepRef((CDataObject *)self, 0, (PyObject *)thunk)) {
|
||||||
|
|
|
@ -21,8 +21,8 @@ CThunkObject_dealloc(PyObject *_self)
|
||||||
Py_XDECREF(self->converters);
|
Py_XDECREF(self->converters);
|
||||||
Py_XDECREF(self->callable);
|
Py_XDECREF(self->callable);
|
||||||
Py_XDECREF(self->restype);
|
Py_XDECREF(self->restype);
|
||||||
if (self->pcl)
|
if (self->pcl_write)
|
||||||
_ctypes_free_closure(self->pcl);
|
ffi_closure_free(self->pcl_write);
|
||||||
PyObject_GC_Del(self);
|
PyObject_GC_Del(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -391,7 +391,8 @@ static CThunkObject* CThunkObject_new(Py_ssize_t nArgs)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
p->pcl = NULL;
|
p->pcl_exec = NULL;
|
||||||
|
p->pcl_write = NULL;
|
||||||
memset(&p->cif, 0, sizeof(p->cif));
|
memset(&p->cif, 0, sizeof(p->cif));
|
||||||
p->converters = NULL;
|
p->converters = NULL;
|
||||||
p->callable = NULL;
|
p->callable = NULL;
|
||||||
|
@ -421,8 +422,9 @@ CThunkObject *_ctypes_alloc_callback(PyObject *callable,
|
||||||
|
|
||||||
assert(CThunk_CheckExact(p));
|
assert(CThunk_CheckExact(p));
|
||||||
|
|
||||||
p->pcl = _ctypes_alloc_closure();
|
p->pcl_write = ffi_closure_alloc(sizeof(ffi_closure),
|
||||||
if (p->pcl == NULL) {
|
&p->pcl_exec);
|
||||||
|
if (p->pcl_write == NULL) {
|
||||||
PyErr_NoMemory();
|
PyErr_NoMemory();
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
@ -467,7 +469,9 @@ CThunkObject *_ctypes_alloc_callback(PyObject *callable,
|
||||||
"ffi_prep_cif failed with %d", result);
|
"ffi_prep_cif failed with %d", result);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
result = ffi_prep_closure(p->pcl, &p->cif, closure_fcn, p);
|
result = ffi_prep_closure_loc(p->pcl_write, &p->cif, closure_fcn,
|
||||||
|
p,
|
||||||
|
p->pcl_exec);
|
||||||
if (result != FFI_OK) {
|
if (result != FFI_OK) {
|
||||||
PyErr_Format(PyExc_RuntimeError,
|
PyErr_Format(PyExc_RuntimeError,
|
||||||
"ffi_prep_closure failed with %d", result);
|
"ffi_prep_closure failed with %d", result);
|
||||||
|
|
|
@ -95,7 +95,8 @@ struct tagCDataObject {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
PyObject_VAR_HEAD
|
PyObject_VAR_HEAD
|
||||||
ffi_closure *pcl; /* the C callable */
|
ffi_closure *pcl_write; /* the C callable, writeable */
|
||||||
|
void *pcl_exec; /* the C callable, executable */
|
||||||
ffi_cif cif;
|
ffi_cif cif;
|
||||||
int flags;
|
int flags;
|
||||||
PyObject *converters;
|
PyObject *converters;
|
||||||
|
@ -428,9 +429,6 @@ extern Py_ssize_t PyUnicode_AsWideChar_fixed(PyUnicodeObject *, wchar_t *, Py_ss
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern void _ctypes_free_closure(void *);
|
|
||||||
extern void *_ctypes_alloc_closure(void);
|
|
||||||
|
|
||||||
extern void _ctypes_add_traceback(char *, char *, int);
|
extern void _ctypes_add_traceback(char *, char *, int);
|
||||||
|
|
||||||
extern PyObject *PyCData_FromBaseObj(PyObject *type, PyObject *base, Py_ssize_t index, char *adr);
|
extern PyObject *PyCData_FromBaseObj(PyObject *type, PyObject *base, Py_ssize_t index, char *adr);
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
ffi_sources = """
|
ffi_sources = """
|
||||||
src/prep_cif.c
|
src/prep_cif.c
|
||||||
|
src/closures.c
|
||||||
|
src/dlmalloc.c
|
||||||
""".split()
|
""".split()
|
||||||
|
|
||||||
ffi_platforms = {
|
ffi_platforms = {
|
||||||
|
|
|
@ -371,10 +371,11 @@ ffi_prep_incoming_args_SYSV(char *stack, void **rvalue,
|
||||||
extern void ffi_closure_OUTER();
|
extern void ffi_closure_OUTER();
|
||||||
|
|
||||||
ffi_status
|
ffi_status
|
||||||
ffi_prep_closure (ffi_closure* closure,
|
ffi_prep_closure_loc (ffi_closure* closure,
|
||||||
ffi_cif* cif,
|
ffi_cif* cif,
|
||||||
void (*fun)(ffi_cif*,void*,void**,void*),
|
void (*fun)(ffi_cif*,void*,void**,void*),
|
||||||
void *user_data)
|
void *user_data,
|
||||||
|
void *codeloc)
|
||||||
{
|
{
|
||||||
short bytes;
|
short bytes;
|
||||||
char *tramp;
|
char *tramp;
|
||||||
|
@ -452,6 +453,5 @@ ffi_prep_closure (ffi_closure* closure,
|
||||||
closure->cif = cif;
|
closure->cif = cif;
|
||||||
closure->user_data = user_data;
|
closure->user_data = user_data;
|
||||||
closure->fun = fun;
|
closure->fun = fun;
|
||||||
|
|
||||||
return FFI_OK;
|
return FFI_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -221,11 +221,15 @@ typedef struct {
|
||||||
void *user_data;
|
void *user_data;
|
||||||
} ffi_closure;
|
} ffi_closure;
|
||||||
|
|
||||||
|
void ffi_closure_free(void *);
|
||||||
|
void *ffi_closure_alloc (size_t size, void **code);
|
||||||
|
|
||||||
ffi_status
|
ffi_status
|
||||||
ffi_prep_closure (ffi_closure*,
|
ffi_prep_closure_loc (ffi_closure*,
|
||||||
ffi_cif *,
|
ffi_cif *,
|
||||||
void (*fun)(ffi_cif*,void*,void**,void*),
|
void (*fun)(ffi_cif*,void*,void**,void*),
|
||||||
void *user_data);
|
void *user_data,
|
||||||
|
void *codeloc);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char tramp[FFI_TRAMPOLINE_SIZE];
|
char tramp[FFI_TRAMPOLINE_SIZE];
|
||||||
|
|
|
@ -93,7 +93,7 @@ static void more_core(void)
|
||||||
/******************************************************************/
|
/******************************************************************/
|
||||||
|
|
||||||
/* put the item back into the free list */
|
/* put the item back into the free list */
|
||||||
void _ctypes_free_closure(void *p)
|
void ffi_closure_free(void *p)
|
||||||
{
|
{
|
||||||
ITEM *item = (ITEM *)p;
|
ITEM *item = (ITEM *)p;
|
||||||
item->next = free_list;
|
item->next = free_list;
|
||||||
|
@ -101,7 +101,7 @@ void _ctypes_free_closure(void *p)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* return one item from the free list, allocating more if needed */
|
/* return one item from the free list, allocating more if needed */
|
||||||
void *_ctypes_alloc_closure(void)
|
void *ffi_closure_alloc(size_t ignored, void** codeloc)
|
||||||
{
|
{
|
||||||
ITEM *item;
|
ITEM *item;
|
||||||
if (!free_list)
|
if (!free_list)
|
||||||
|
@ -110,5 +110,7 @@ void *_ctypes_alloc_closure(void)
|
||||||
return NULL;
|
return NULL;
|
||||||
item = free_list;
|
item = free_list;
|
||||||
free_list = item->next;
|
free_list = item->next;
|
||||||
return item;
|
*codeloc = (void *)item;
|
||||||
|
return (void *)item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
3
setup.py
3
setup.py
|
@ -1867,8 +1867,7 @@ class PyBuildExt(build_ext):
|
||||||
'_ctypes/callbacks.c',
|
'_ctypes/callbacks.c',
|
||||||
'_ctypes/callproc.c',
|
'_ctypes/callproc.c',
|
||||||
'_ctypes/stgdict.c',
|
'_ctypes/stgdict.c',
|
||||||
'_ctypes/cfield.c',
|
'_ctypes/cfield.c']
|
||||||
'_ctypes/malloc_closure.c']
|
|
||||||
depends = ['_ctypes/ctypes.h']
|
depends = ['_ctypes/ctypes.h']
|
||||||
|
|
||||||
if sys.platform == 'darwin':
|
if sys.platform == 'darwin':
|
||||||
|
|
Loading…
Reference in New Issue