]> granicus.if.org Git - python/commitdiff
Bug #1500293: fix memory leaks in _subprocess module.
authorGeorg Brandl <georg@python.org>
Sun, 4 Jun 2006 22:15:37 +0000 (22:15 +0000)
committerGeorg Brandl <georg@python.org>
Sun, 4 Jun 2006 22:15:37 +0000 (22:15 +0000)
Lib/subprocess.py
PC/_subprocess.c

index 87508ccff2ca29117aa08734b3714ec4712cda62..a281cd8f2227d1a73bb699a301325ce08523198c 100644 (file)
@@ -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
index 2e724c62114a27038a866922fcdf4422fadb7005..c93f84bd1fe78216701ed3c6582b2746d66b99c7 100644 (file)
@@ -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*