diff options
author | Petr Viktorin <pviktori@redhat.com> | 2014-12-04 12:44:56 +0100 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2015-06-10 06:06:18 +0200 |
commit | f5838df58ea36e64cd0295b595df9cbd10d8c757 (patch) | |
tree | f4ce6ebd841935566d8b60ad3f4cac183b80892f /lib | |
parent | 2bf1443bd0f1cb95d11f42db5ef4a7637981ee6b (diff) | |
download | samba-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.c | 31 |
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[] = { |