* 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.
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 @@
         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 @@
         Py_XDECREF(gc_module);
         return NULL;
     }
+    Py_XDECREF(preexec_fn_args_tuple);
     Py_XDECREF(gc_module);
 
     if (pid == -1)
@@ -322,6 +329,7 @@
     _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)