Commit 817b4894 authored by Thomas Heller's avatar Thomas Heller

Merged revisions 53556 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk/Modules/_ctypes

........
  r53556 | thomas.heller | 2007-01-25 19:34:14 +0100 (Do, 25 Jan 2007) | 3 lines

  Fix for #1643874: When calling SysAllocString, create a PyCObject
  which will eventually call SysFreeString to free the BSTR resource.
........
parent 564c9f5f
...@@ -154,6 +154,8 @@ Extension Modules ...@@ -154,6 +154,8 @@ Extension Modules
Library Library
------- -------
- Patch #1643874: memory leak in ctypes fixed.
- Bug #1598181: Avoid O(N**2) bottleneck in subprocess communicate(). - Bug #1598181: Avoid O(N**2) bottleneck in subprocess communicate().
- Patch #1627441: close sockets properly in urllib2. - Patch #1627441: close sockets properly in urllib2.
......
...@@ -1424,10 +1424,19 @@ Z_get(void *ptr, unsigned size) ...@@ -1424,10 +1424,19 @@ Z_get(void *ptr, unsigned size)
#endif #endif
#ifdef MS_WIN32 #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 * static PyObject *
BSTR_set(void *ptr, PyObject *value, unsigned size) BSTR_set(void *ptr, PyObject *value, unsigned size)
{ {
BSTR bstr; BSTR bstr;
PyObject *result;
/* convert value into a PyUnicodeObject or NULL */ /* convert value into a PyUnicodeObject or NULL */
if (Py_None == value) { if (Py_None == value) {
...@@ -1455,15 +1464,19 @@ BSTR_set(void *ptr, PyObject *value, unsigned size) ...@@ -1455,15 +1464,19 @@ BSTR_set(void *ptr, PyObject *value, unsigned size)
} else } else
bstr = NULL; bstr = NULL;
/* free the previous contents, if any */ if (bstr) {
if (*(BSTR *)ptr) result = PyCObject_FromVoidPtr((void *)bstr, _my_SysFreeString);
SysFreeString(*(BSTR *)ptr); if (result == NULL) {
SysFreeString(bstr);
return NULL;
}
} else {
result = Py_None;
Py_INCREF(result);
}
/* and store it */
*(BSTR *)ptr = bstr; *(BSTR *)ptr = bstr;
return result;
/* We don't need to keep any other object */
_RET(value);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment