]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
pytevent: Better error and reference handling
authorPetr Viktorin <pviktori@redhat.com>
Thu, 4 Dec 2014 11:44:56 +0000 (12:44 +0100)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 10 Jun 2015 04:06:18 +0000 (06:06 +0200)
py_backend_list:
- Handle cases of PyString_FromString or PyList_Append failing.
- Properly decrease the reference count of the returned strings.

py_register_backend:
- Decref "name" after use

Signed-off-by: Petr Viktorin <pviktori@redhat.com>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Jelmer Vernooij <jelmer@samba.org>
lib/tevent/pytevent.c

index af3f9d67df64f975deb6413363a38df92bd1b386..4de0e3de7e3900df27defda9a21c6a0c22bd9da3 100644 (file)
@@ -177,14 +177,18 @@ static PyObject *py_register_backend(PyObject *self, PyObject *args)
 
        if (!PyString_Check(name)) {
                PyErr_SetNone(PyExc_TypeError);
+               Py_DECREF(name);
                return NULL;
        }
 
        if (!tevent_register_backend(PyString_AsString(name), &py_tevent_ops)) { /* FIXME: What to do with backend */
                PyErr_SetNone(PyExc_RuntimeError);
+               Py_DECREF(name);
                return NULL;
        }
 
+       Py_DECREF(name);
+
        Py_RETURN_NONE;
 }
 
@@ -684,9 +688,10 @@ static PyObject *py_set_default_backend(PyObject *self, PyObject *args)
 
 static PyObject *py_backend_list(PyObject *self)
 {
-       PyObject *ret;
-       int i;
-       const char **backends;
+       PyObject *ret = NULL;
+       PyObject *string = NULL;
+       int i, result;
+       const char **backends = NULL;
 
        ret = PyList_New(0);
        if (ret == NULL) {
@@ -696,16 +701,30 @@ static PyObject *py_backend_list(PyObject *self)
        backends = tevent_backend_list(NULL);
        if (backends == NULL) {
                PyErr_SetNone(PyExc_RuntimeError);
-               Py_DECREF(ret);
-               return NULL;
+               goto err;
        }
        for (i = 0; backends[i]; i++) {
-               PyList_Append(ret, PyString_FromString(backends[i]));
+               string = PyString_FromString(backends[i]);
+               if (!string) {
+                       goto err;
+               }
+               result = PyList_Append(ret, string);
+               if (result) {
+                       goto err;
+               }
+               Py_DECREF(string);
+               string = NULL;
        }
 
        talloc_free(backends);
 
        return ret;
+
+err:
+       Py_XDECREF(ret);
+       Py_XDECREF(string);
+       talloc_free(backends);
+       return NULL;
 }
 
 static PyMethodDef tevent_methods[] = {