[Python-checkins] cpython (merge 3.3 -> default): Issue #16628: Fix a memory leak in ctypes.resize().

antoine.pitrou python-checkins at python.org
Sat Dec 8 11:10:24 CET 2012


http://hg.python.org/cpython/rev/def01022870a
changeset:   80745:def01022870a
parent:      80742:3576c0c6f860
parent:      80744:cae5f3266b81
user:        Antoine Pitrou <solipsis at pitrou.net>
date:        Sat Dec 08 11:07:46 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
@@ -159,6 +159,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