[Python-checkins] cpython (merge 3.2 -> 3.3): Issue #16628: Fix a memory leak in ctypes.resize().
antoine.pitrou
python-checkins at python.org
Sat Dec 8 11:10:22 CET 2012
http://hg.python.org/cpython/rev/cae5f3266b81
changeset: 80744:cae5f3266b81
branch: 3.3
parent: 80735:3cb85250a0a3
parent: 80743:1996171cfb96
user: Antoine Pitrou <solipsis at pitrou.net>
date: Sat Dec 08 11:07:16 2012 +0100
summary:
Issue #16628: Fix a memory leak in ctypes.resize().
files:
Misc/NEWS | 2 ++
Modules/_ctypes/_ctypes.c | 2 +-
Modules/_ctypes/callproc.c | 2 +-
Modules/_ctypes/ctypes.h | 1 +
4 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -104,6 +104,8 @@
Library
-------
+- Issue #16628: Fix a memory leak in ctypes.resize().
+
- Issue #13120: Allow to call pdb.set_trace() from thread.
Patch by Ilya Sandler.
diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c
--- a/Modules/_ctypes/_ctypes.c
+++ b/Modules/_ctypes/_ctypes.c
@@ -2446,7 +2446,7 @@
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
--- a/Modules/_ctypes/callproc.c
+++ b/Modules/_ctypes/callproc.c
@@ -1658,7 +1658,7 @@
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
--- a/Modules/_ctypes/ctypes.h
+++ b/Modules/_ctypes/ctypes.h
@@ -116,6 +116,7 @@
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)
--
Repository URL: http://hg.python.org/cpython
More information about the Python-checkins
mailing list