From: Georg Brandl Date: Sun, 4 Jun 2006 22:15:45 +0000 (+0000) Subject: Bug #1500293: fix memory leaks in _subprocess module. X-Git-Tag: v2.4.4c1~205 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bf1f7683ab7d1ec9efcf4a1422d2ebc0d6d0130c;p=thirdparty%2FPython%2Fcpython.git Bug #1500293: fix memory leaks in _subprocess module. (backport from rev. 46651) --- diff --git a/Lib/subprocess.py b/Lib/subprocess.py index bbd26c7b0e80..2750f79663b7 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -369,6 +369,7 @@ if mswindows: hStdInput = None hStdOutput = None hStdError = None + wShowWindow = 0 class pywintypes: error = IOError else: @@ -662,18 +663,17 @@ class Popen(object): args = list2cmdline(args) # Process startup details - default_startupinfo = STARTUPINFO() if startupinfo == None: - startupinfo = default_startupinfo - if not None in (p2cread, c2pwrite, errwrite): + startupinfo = STARTUPINFO() + if None not in (p2cread, c2pwrite, errwrite): startupinfo.dwFlags |= STARTF_USESTDHANDLES startupinfo.hStdInput = p2cread startupinfo.hStdOutput = c2pwrite startupinfo.hStdError = errwrite if shell: - default_startupinfo.dwFlags |= STARTF_USESHOWWINDOW - default_startupinfo.wShowWindow = SW_HIDE + startupinfo.dwFlags |= STARTF_USESHOWWINDOW + startupinfo.wShowWindow = SW_HIDE comspec = os.environ.get("COMSPEC", "cmd.exe") args = comspec + " /c " + args if (GetVersion() >= 0x80000000L or diff --git a/PC/_subprocess.c b/PC/_subprocess.c index 61544c32343a..ddaef5ca3413 100644 --- a/PC/_subprocess.c +++ b/PC/_subprocess.c @@ -247,19 +247,23 @@ static int getint(PyObject* obj, char* name) { PyObject* value; + int ret; value = PyObject_GetAttrString(obj, name); if (! value) { PyErr_Clear(); /* FIXME: propagate error? */ return 0; } - return (int) PyInt_AsLong(value); + ret = (int) PyInt_AsLong(value); + Py_DECREF(value); + return ret; } static HANDLE gethandle(PyObject* obj, char* name) { sp_handle_object* value; + HANDLE ret; value = (sp_handle_object*) PyObject_GetAttrString(obj, name); if (! value) { @@ -267,8 +271,11 @@ gethandle(PyObject* obj, char* name) return NULL; } if (value->ob_type != &sp_handle_type) - return NULL; - return value->handle; + ret = NULL; + else + ret = value->handle; + Py_DECREF(value); + return ret; } static PyObject*