summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorGregory P. Smith <greg@mad-scientist.com>2010-03-19 16:53:08 (GMT)
committerGregory P. Smith <greg@mad-scientist.com>2010-03-19 16:53:08 (GMT)
commit32ec9da16617d7773d2a52a7fbba935aa9a1eba0 (patch)
treef3cb7fb1b088c4f5f635f7b2af3764502366e806 /Modules
parent3f88c0ece636ce533c6cbbfdd72e99518c6db974 (diff)
downloadcpython-32ec9da16617d7773d2a52a7fbba935aa9a1eba0.zip
cpython-32ec9da16617d7773d2a52a7fbba935aa9a1eba0.tar.gz
cpython-32ec9da16617d7773d2a52a7fbba935aa9a1eba0.tar.bz2
* Fix a refleak when a preexec_fn was supplied (preexec_fn_args_tuple was not
being defref'ed). * Fixes another potential refleak of a reference to the gc module in the unlikely odd case where gc module isenabled or disable calls fail. * Adds a unittest for the above case to verify behavior and lack of leaks.
Diffstat (limited to 'Modules')
-rw-r--r--Modules/_posixsubprocess.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c
index f9b38b6..a6008ef 100644
--- a/Modules/_posixsubprocess.c
+++ b/Modules/_posixsubprocess.c
@@ -204,15 +204,21 @@ subprocess_fork_exec(PyObject* self, PyObject *args)
if (gc_module == NULL)
return NULL;
result = PyObject_CallMethod(gc_module, "isenabled", NULL);
- if (result == NULL)
+ if (result == NULL) {
+ Py_DECREF(gc_module);
return NULL;
+ }
need_to_reenable_gc = PyObject_IsTrue(result);
Py_DECREF(result);
- if (need_to_reenable_gc == -1)
+ if (need_to_reenable_gc == -1) {
+ Py_DECREF(gc_module);
return NULL;
+ }
result = PyObject_CallMethod(gc_module, "disable", NULL);
- if (result == NULL)
+ if (result == NULL) {
+ Py_DECREF(gc_module);
return NULL;
+ }
Py_DECREF(result);
}
@@ -307,6 +313,7 @@ subprocess_fork_exec(PyObject* self, PyObject *args)
Py_XDECREF(gc_module);
return NULL;
}
+ Py_XDECREF(preexec_fn_args_tuple);
Py_XDECREF(gc_module);
if (pid == -1)
@@ -322,6 +329,7 @@ cleanup:
_Py_FreeCharPArray(exec_array);
Py_XDECREF(converted_args);
Py_XDECREF(fast_args);
+ Py_XDECREF(preexec_fn_args_tuple);
/* Reenable gc if it was disabled. */
if (need_to_reenable_gc)