Commit 305e1a74 authored by Antoine Pitrou's avatar Antoine Pitrou

Issue #16628: Fix a memory leak in ctypes.resize().

parent ed636a84
...@@ -175,6 +175,8 @@ Core and Builtins ...@@ -175,6 +175,8 @@ Core and Builtins
Library Library
------- -------
- Issue #16628: Fix a memory leak in ctypes.resize().
- Issue #13120: Allow to call pdb.set_trace() from thread. - Issue #13120: Allow to call pdb.set_trace() from thread.
Patch by Ilya Sandler. Patch by Ilya Sandler.
......
...@@ -2442,7 +2442,7 @@ PyCData_clear(CDataObject *self) ...@@ -2442,7 +2442,7 @@ PyCData_clear(CDataObject *self)
assert(dict); /* Cannot be NULL for CDataObject instances */ assert(dict); /* Cannot be NULL for CDataObject instances */
Py_CLEAR(self->b_objects); Py_CLEAR(self->b_objects);
if ((self->b_needsfree) if ((self->b_needsfree)
&& ((size_t)dict->size > sizeof(self->b_value))) && _CDataObject_HasExternalBuffer(self))
PyMem_Free(self->b_ptr); PyMem_Free(self->b_ptr);
self->b_ptr = NULL; self->b_ptr = NULL;
Py_CLEAR(self->b_base); Py_CLEAR(self->b_base);
......
...@@ -1666,7 +1666,7 @@ resize(PyObject *self, PyObject *args) ...@@ -1666,7 +1666,7 @@ resize(PyObject *self, PyObject *args)
obj->b_size = size; obj->b_size = size;
goto done; goto done;
} }
if (obj->b_size <= sizeof(obj->b_value)) { if (!_CDataObject_HasExternalBuffer(obj)) {
/* We are currently using the objects default buffer, but it /* We are currently using the objects default buffer, but it
isn't large enough any more. */ isn't large enough any more. */
void *ptr = PyMem_Malloc(size); void *ptr = PyMem_Malloc(size);
......
...@@ -116,6 +116,7 @@ extern int PyObject_stginfo(PyObject *self, Py_ssize_t *psize, Py_ssize_t *palig ...@@ -116,6 +116,7 @@ extern int PyObject_stginfo(PyObject *self, Py_ssize_t *psize, Py_ssize_t *palig
extern PyTypeObject PyCData_Type; extern PyTypeObject PyCData_Type;
#define CDataObject_CheckExact(v) ((v)->ob_type == &PyCData_Type) #define CDataObject_CheckExact(v) ((v)->ob_type == &PyCData_Type)
#define CDataObject_Check(v) PyObject_TypeCheck(v, &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; extern PyTypeObject PyCSimpleType_Type;
#define PyCSimpleTypeObject_CheckExact(v) ((v)->ob_type == &PyCSimpleType_Type) #define PyCSimpleTypeObject_CheckExact(v) ((v)->ob_type == &PyCSimpleType_Type)
......
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