summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorg Brandl <georg@python.org>2006-06-04 22:15:37 (GMT)
committerGeorg Brandl <georg@python.org>2006-06-04 22:15:37 (GMT)
commitad62489e4706ec4ad6cf24a067969e8d64612fcb (patch)
treec3c55cec5a9d63fbb278c0ddbedfbcab43c364fe
parentddbaa660d3b64a71b4ac9eab64b1bb944ca1276b (diff)
downloadcpython-ad62489e4706ec4ad6cf24a067969e8d64612fcb.zip
cpython-ad62489e4706ec4ad6cf24a067969e8d64612fcb.tar.gz
cpython-ad62489e4706ec4ad6cf24a067969e8d64612fcb.tar.bz2
Bug #1500293: fix memory leaks in _subprocess module.
-rw-r--r--Lib/subprocess.py10
-rw-r--r--PC/_subprocess.c13
2 files changed, 15 insertions, 8 deletions
diff --git a/Lib/subprocess.py b/Lib/subprocess.py
index 87508cc..a281cd8 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 2e724c6..c93f84b 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*