Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 305e1a7

Browse files
committed
Issue #16628: Fix a memory leak in ctypes.resize().
1 parent ed636a8 commit 305e1a7

4 files changed

Lines changed: 5 additions & 2 deletions

File tree

Misc/NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,8 @@ Core and Builtins
175175
Library
176176
-------
177177

178+
- Issue #16628: Fix a memory leak in ctypes.resize().
179+
178180
- Issue #13120: Allow to call pdb.set_trace() from thread.
179181
Patch by Ilya Sandler.
180182

Modules/_ctypes/_ctypes.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2442,7 +2442,7 @@ PyCData_clear(CDataObject *self)
24422442
assert(dict); /* Cannot be NULL for CDataObject instances */
24432443
Py_CLEAR(self->b_objects);
24442444
if ((self->b_needsfree)
2445-
&& ((size_t)dict->size > sizeof(self->b_value)))
2445+
&& _CDataObject_HasExternalBuffer(self))
24462446
PyMem_Free(self->b_ptr);
24472447
self->b_ptr = NULL;
24482448
Py_CLEAR(self->b_base);

Modules/_ctypes/callproc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1666,7 +1666,7 @@ resize(PyObject *self, PyObject *args)
16661666
obj->b_size = size;
16671667
goto done;
16681668
}
1669-
if (obj->b_size <= sizeof(obj->b_value)) {
1669+
if (!_CDataObject_HasExternalBuffer(obj)) {
16701670
/* We are currently using the objects default buffer, but it
16711671
isn't large enough any more. */
16721672
void *ptr = PyMem_Malloc(size);

Modules/_ctypes/ctypes.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ extern int PyObject_stginfo(PyObject *self, Py_ssize_t *psize, Py_ssize_t *palig
116116
extern PyTypeObject PyCData_Type;
117117
#define CDataObject_CheckExact(v) ((v)->ob_type == &PyCData_Type)
118118
#define CDataObject_Check(v) PyObject_TypeCheck(v, &PyCData_Type)
119+
#define _CDataObject_HasExternalBuffer(v) ((v)->b_ptr != (char *)&(v)->b_value)
119120

120121
extern PyTypeObject PyCSimpleType_Type;
121122
#define PyCSimpleTypeObject_CheckExact(v) ((v)->ob_type == &PyCSimpleType_Type)

0 commit comments

Comments
 (0)