]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #16628: Fix a memory leak in ctypes.resize().
authorAntoine Pitrou <solipsis@pitrou.net>
Sat, 8 Dec 2012 10:05:50 +0000 (11:05 +0100)
committerAntoine Pitrou <solipsis@pitrou.net>
Sat, 8 Dec 2012 10:05:50 +0000 (11:05 +0100)
Misc/NEWS
Modules/_ctypes/_ctypes.c
Modules/_ctypes/callproc.c
Modules/_ctypes/ctypes.h

index 3894d2e3683a3ae29c653a5fea9fae0694920662..3c9f382fe3f797de4f2cf45e58e45aadc6428063 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -175,6 +175,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #16628: Fix a memory leak in ctypes.resize().
+
 - Issue #13120: Allow to call pdb.set_trace() from thread.
   Patch by Ilya Sandler.
 
index 8be5958b0a089e705ad20b024d6bc0c3ba0f2fc5..603b3b8d8cf412e450d9a7ea4907a3e7f217c4be 100644 (file)
@@ -2442,7 +2442,7 @@ PyCData_clear(CDataObject *self)
     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);
index 1f3c1c01853a1a6a8b22f02d4a65fa0562b9c4ef..34659958a8b62c13266e715e03d824ee1a2152fc 100644 (file)
@@ -1666,7 +1666,7 @@ resize(PyObject *self, PyObject *args)
         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);
index 27abe65145fb00f4f52979dfbbafa984164402da..5237ac23d6d1aa1d53d8dea6cfe590432a797de7 100644 (file)
@@ -116,6 +116,7 @@ extern int PyObject_stginfo(PyObject *self, Py_ssize_t *psize, Py_ssize_t *palig
 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)