dpward / rpms / sssd

Forked from rpms/sssd 3 years ago
Clone
Blob Blame History Raw
From b615258d6df8ad867cee99bdccffff05127fbc92 Mon Sep 17 00:00:00 2001
From: Pavel Reichl <preichl@redhat.com>
Date: Mon, 29 Sep 2014 16:40:53 +0100
Subject: [PATCH 22/22] pyhbac,pysss: fix reference leaks

Resolves:
https://fedorahosted.org/sssd/ticket/1195

Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
---
 src/python/pyhbac.c | 22 +++++++++++++---------
 src/python/pysss.c  | 10 +++++++---
 2 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/src/python/pyhbac.c b/src/python/pyhbac.c
index e9dce9b01b78401516b5c21141be8007b4a94aec..dd345a6eb4db8ac6104251d5b9c8f11a160e280d 100644
--- a/src/python/pyhbac.c
+++ b/src/python/pyhbac.c
@@ -139,14 +139,17 @@ sequence_as_string_list(PyObject *seq, const char *paramname)
 
         utf_item = get_utf8_string(item, p);
         if (utf_item == NULL) {
+            Py_DECREF(item);
             return NULL;
         }
 
         ret[i] = py_strdup(PyString_AsString(utf_item));
         Py_DECREF(utf_item);
         if (!ret[i]) {
+            Py_DECREF(item);
             return NULL;
         }
+        Py_DECREF(item);
     }
 
     ret[i] = NULL;
@@ -242,10 +245,7 @@ str_concat_sequence(PyObject *seq, const char *delim)
         if (item == NULL) goto fail;
 
         part = PyString_AsString(item);
-        if (part == NULL) {
-            Py_DECREF(item);
-            goto fail;
-        }
+        if (part == NULL) goto fail;
 
         if (s) {
             s = py_strcat_realloc(s, delim);
@@ -260,7 +260,9 @@ str_concat_sequence(PyObject *seq, const char *delim)
     }
 
     return s;
+
 fail:
+    Py_XDECREF(item);
     PyMem_Free(s);
     return NULL;
 }
@@ -269,11 +271,13 @@ fail:
 static void
 set_hbac_exception(PyObject *exc, struct hbac_info *error)
 {
-    PyErr_SetObject(exc,
-                    Py_BuildValue(sss_py_const_p(char, "(i,s)"),
-                                  error->code,
-                                  error->rule_name ? \
-                                        error->rule_name : "no rule"));
+    PyObject *obj;
+
+    obj = Py_BuildValue(sss_py_const_p(char, "(i,s)"), error->code,
+                        error->rule_name ? error->rule_name : "no rule");
+
+    PyErr_SetObject(exc, obj);
+    Py_XDECREF(obj);
 }
 
 /* ==================== HBAC Rule Element ========================*/
diff --git a/src/python/pysss.c b/src/python/pysss.c
index 8f98f081c9600b74f5953faef40cb40b30388319..9e899f1399553a950e41e157612a7360de4c07b5 100644
--- a/src/python/pysss.c
+++ b/src/python/pysss.c
@@ -850,7 +850,7 @@ static PyObject *PySssLocalObject_new(PyTypeObject *type,
     if (confdb_path == NULL) {
         talloc_free(mem_ctx);
         PyErr_NoMemory();
-        return NULL;
+        goto fail;
     }
 
     /* Connect to the conf db */
@@ -859,7 +859,7 @@ static PyObject *PySssLocalObject_new(PyTypeObject *type,
         talloc_free(mem_ctx);
         PyErr_SetSssErrorWithMessage(ret,
                 "Could not initialize connection to the confdb\n");
-        return NULL;
+        goto fail;
     }
 
     ret = sssd_domain_init(self->mem_ctx, self->confdb, "local",
@@ -868,7 +868,7 @@ static PyObject *PySssLocalObject_new(PyTypeObject *type,
         talloc_free(mem_ctx);
         PyErr_SetSssErrorWithMessage(ret,
                 "Could not initialize connection to the sysdb\n");
-        return NULL;
+        goto fail;
     }
     self->sysdb = self->local->sysdb;
 
@@ -876,6 +876,10 @@ static PyObject *PySssLocalObject_new(PyTypeObject *type,
     self->unlock = DO_UNLOCK;
 
     return (PyObject *) self;
+
+fail:
+    Py_DECREF(self);
+    return NULL;
 }
 
 /*
-- 
1.9.3