summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorPetr Viktorin <pviktori@redhat.com>2014-12-04 12:44:56 +0100
committerAndrew Bartlett <abartlet@samba.org>2015-06-10 06:06:18 +0200
commitf5838df58ea36e64cd0295b595df9cbd10d8c757 (patch)
treef4ce6ebd841935566d8b60ad3f4cac183b80892f /lib
parent2bf1443bd0f1cb95d11f42db5ef4a7637981ee6b (diff)
downloadsamba-f5838df58ea36e64cd0295b595df9cbd10d8c757.tar.gz
pytevent: Better error and reference handling
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>
Diffstat (limited to 'lib')
-rw-r--r--lib/tevent/pytevent.c31
1 files changed, 25 insertions, 6 deletions
diff --git a/lib/tevent/pytevent.c b/lib/tevent/pytevent.c
index af3f9d67df6..4de0e3de7e3 100644
--- a/lib/tevent/pytevent.c
+++ b/lib/tevent/pytevent.c
@@ -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[] = {