Fix for #1643874: When calling SysAllocString, create a PyCObject

which will eventually call SysFreeString to free the BSTR resource.
This commit is contained in:
Thomas Heller 2007-01-25 18:34:14 +00:00
parent 391e917b1a
commit 4378215474
2 changed files with 23 additions and 8 deletions

View File

@ -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.

View File

@ -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;
}