From f493cbd8248650e14422ea04e1c3953fdcacd218 Mon Sep 17 00:00:00 2001 From: Thomas Heller Date: Thu, 22 Mar 2007 19:44:31 +0000 Subject: [PATCH] Back out "Patch #1643874: memory leak in ctypes fixed." The code in this patch leaves no way to give up the ownership of a BSTR instance. --- Misc/NEWS | 2 -- Modules/_ctypes/cfield.c | 29 ++++++++--------------------- 2 files changed, 8 insertions(+), 23 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS index 0d9ec6c238c..064e01d6cf4 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -361,8 +361,6 @@ Library - Bug #1643943: Fix time.strptime's support for the %U directive. -- Patch #1643874: memory leak in ctypes fixed. - - Patch #1507247: tarfile.py: use current umask for intermediate directories. diff --git a/Modules/_ctypes/cfield.c b/Modules/_ctypes/cfield.c index 1a6ceaf6cf1..9b9088259bf 100644 --- a/Modules/_ctypes/cfield.c +++ b/Modules/_ctypes/cfield.c @@ -1461,19 +1461,10 @@ 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) { @@ -1501,19 +1492,15 @@ BSTR_set(void *ptr, PyObject *value, unsigned size) } else bstr = NULL; - if (bstr) { - result = PyCObject_FromVoidPtr((void *)bstr, _my_SysFreeString); - if (result == NULL) { - SysFreeString(bstr); - return NULL; - } - } else { - result = Py_None; - Py_INCREF(result); - } - + /* free the previous contents, if any */ + if (*(BSTR *)ptr) + SysFreeString(*(BSTR *)ptr); + + /* and store it */ *(BSTR *)ptr = bstr; - return result; + + /* We don't need to keep any other object */ + _RET(value); }