diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2012-12-08 10:05:50 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2012-12-08 10:05:50 (GMT) |
commit | 8eeda72742ef98c635ce89e0b0da0af3de508e77 (patch) | |
tree | 7e94d2f256ae6a4634e9842f15107d130bfe8fa4 /Modules | |
parent | 766849b978efd35c483348f8b1a788f6200cb215 (diff) | |
download | cpython-8eeda72742ef98c635ce89e0b0da0af3de508e77.zip cpython-8eeda72742ef98c635ce89e0b0da0af3de508e77.tar.gz cpython-8eeda72742ef98c635ce89e0b0da0af3de508e77.tar.bz2 |
Issue #16628: Fix a memory leak in ctypes.resize().
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_ctypes/_ctypes.c | 2 | ||||
-rw-r--r-- | Modules/_ctypes/callproc.c | 2 | ||||
-rw-r--r-- | Modules/_ctypes/ctypes.h | 1 |
3 files changed, 3 insertions, 2 deletions
diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 4ae2c41..accfcbf 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -2530,7 +2530,7 @@ PyCData_clear(CDataObject *self) assert(dict); /* Cannot be NULL for CDataObject instances */ Py_CLEAR(self->b_objects); if ((self->b_needsfree) - && ((size_t)dict->size > sizeof(self->b_value))) + && _CDataObject_HasExternalBuffer(self)) PyMem_Free(self->b_ptr); self->b_ptr = NULL; Py_CLEAR(self->b_base); diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 78c6dc0..ef3e974 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -1740,7 +1740,7 @@ resize(PyObject *self, PyObject *args) obj->b_size = size; goto done; } - if (obj->b_size <= sizeof(obj->b_value)) { + if (!_CDataObject_HasExternalBuffer(obj)) { /* We are currently using the objects default buffer, but it isn't large enough any more. */ void *ptr = PyMem_Malloc(size); diff --git a/Modules/_ctypes/ctypes.h b/Modules/_ctypes/ctypes.h index 59640cc..141b34b 100644 --- a/Modules/_ctypes/ctypes.h +++ b/Modules/_ctypes/ctypes.h @@ -153,6 +153,7 @@ extern int PyObject_stginfo(PyObject *self, Py_ssize_t *psize, Py_ssize_t *palig extern PyTypeObject PyCData_Type; #define CDataObject_CheckExact(v) ((v)->ob_type == &PyCData_Type) #define CDataObject_Check(v) PyObject_TypeCheck(v, &PyCData_Type) +#define _CDataObject_HasExternalBuffer(v) ((v)->b_ptr != (char *)&(v)->b_value) extern PyTypeObject PyCSimpleType_Type; #define PyCSimpleTypeObject_CheckExact(v) ((v)->ob_type == &PyCSimpleType_Type) |