From ad62489e4706ec4ad6cf24a067969e8d64612fcb Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sun, 4 Jun 2006 22:15:37 +0000 Subject: [PATCH] Bug #1500293: fix memory leaks in _subprocess module. --- Lib/subprocess.py | 10 +++++----- PC/_subprocess.c | 13 ++++++++++--- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/Lib/subprocess.py b/Lib/subprocess.py index 87508ccff2c..a281cd8f222 100644 --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -388,6 +388,7 @@ if mswindows: hStdInput = None hStdOutput = None hStdError = None + wShowWindow = 0 class pywintypes: error = IOError else: @@ -744,18 +745,17 @@ class Popen(object): args = list2cmdline(args) # Process startup details - default_startupinfo = STARTUPINFO() if startupinfo is 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 2e724c62114..c93f84bd1fe 100644 --- a/PC/_subprocess.c +++ b/PC/_subprocess.c @@ -250,19 +250,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) { @@ -270,8 +274,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*