diff options
author | Gregory P. Smith <greg@mad-scientist.com> | 2010-03-19 16:53:08 (GMT) |
---|---|---|
committer | Gregory P. Smith <greg@mad-scientist.com> | 2010-03-19 16:53:08 (GMT) |
commit | 32ec9da16617d7773d2a52a7fbba935aa9a1eba0 (patch) | |
tree | f3cb7fb1b088c4f5f635f7b2af3764502366e806 /Modules | |
parent | 3f88c0ece636ce533c6cbbfdd72e99518c6db974 (diff) | |
download | cpython-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.c | 14 |
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) |