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

Skip to content

Commit 12f33df

Browse files
committed
Issue #16628: Fix a memory leak in ctypes.resize().
2 parents f04d1bb + 305e1a7 commit 12f33df

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
@@ -104,6 +104,8 @@ Core and Builtins
104104
Library
105105
-------
106106

107+
- Issue #16628: Fix a memory leak in ctypes.resize().
108+
107109
- Issue #13120: Allow to call pdb.set_trace() from thread.
108110
Patch by Ilya Sandler.
109111

Modules/_ctypes/_ctypes.c

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

Modules/_ctypes/callproc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1658,7 +1658,7 @@ resize(PyObject *self, PyObject *args)
16581658
obj->b_size = size;
16591659
goto done;
16601660
}
1661-
if (obj->b_size <= sizeof(obj->b_value)) {
1661+
if (!_CDataObject_HasExternalBuffer(obj)) {
16621662
/* We are currently using the objects default buffer, but it
16631663
isn't large enough any more. */
16641664
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)