From: Thomas Heller Date: Thu, 25 Jan 2007 18:34:14 +0000 (+0000) Subject: Fix for #1643874: When calling SysAllocString, create a PyCObject X-Git-Tag: v2.6a1~2231 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4378215474361ea0f94341275285a856970aa2b8;p=thirdparty%2FPython%2Fcpython.git Fix for #1643874: When calling SysAllocString, create a PyCObject which will eventually call SysFreeString to free the BSTR resource. --- diff --git a/Misc/NEWS b/Misc/NEWS index ad72b085107c..3fad86217a2b 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -123,6 +123,8 @@ Core and builtins Library ------- +- Patch #1643874: memory leak in ctypes fixed. + - Patch #1627441: close sockets properly in urllib2. - Bug #494589: make ntpath.expandvars behave according to its docstring. diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c index ad83195276f9..799b457ed807 100644 --- a/Modules/_ctypes/cfield.c +++ b/Modules/_ctypes/cfield.c @@ -1432,10 +1432,19 @@ Z_get(void *ptr, unsigned size) #endif #ifdef MS_WIN32 +/* We cannot use SysFreeString as the PyCObject_FromVoidPtr + because of different calling convention +*/ +static void _my_SysFreeString(void *p) +{ + SysFreeString((BSTR)p); +} + static PyObject * BSTR_set(void *ptr, PyObject *value, unsigned size) { BSTR bstr; + PyObject *result; /* convert value into a PyUnicodeObject or NULL */ if (Py_None == value) { @@ -1463,15 +1472,19 @@ BSTR_set(void *ptr, PyObject *value, unsigned size) } else bstr = NULL; - /* free the previous contents, if any */ - if (*(BSTR *)ptr) - SysFreeString(*(BSTR *)ptr); - - /* and store it */ - *(BSTR *)ptr = bstr; + if (bstr) { + result = PyCObject_FromVoidPtr((void *)bstr, _my_SysFreeString); + if (result == NULL) { + SysFreeString(bstr); + return NULL; + } + } else { + result = Py_None; + Py_INCREF(result); + } - /* We don't need to keep any other object */ - _RET(value); + *(BSTR *)ptr = bstr; + return result; }