From 9f8b09e31685ca17754f987683bdacf94fac7fde Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 9 May 2017 08:55:55 +0200 Subject: [PATCH] talloc: improve pytalloc error code paths if talloc* fails Signed-off-by: Stefan Metzmacher --- lib/talloc/pytalloc.c | 12 ++++++++---- lib/talloc/pytalloc_util.c | 24 ++++++++++++++++-------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/lib/talloc/pytalloc.c b/lib/talloc/pytalloc.c index 95dbb297a460..05f1206f7665 100644 --- a/lib/talloc/pytalloc.c +++ b/lib/talloc/pytalloc.c @@ -96,8 +96,10 @@ static PyObject *pytalloc_default_repr(PyObject *obj) static void pytalloc_dealloc(PyObject* self) { pytalloc_Object *obj = (pytalloc_Object *)self; - assert(talloc_unlink(NULL, obj->talloc_ctx) != -1); - obj->talloc_ctx = NULL; + if (obj->talloc_ctx != NULL) { + assert(talloc_unlink(NULL, obj->talloc_ctx) != -1); + obj->talloc_ctx = NULL; + } self->ob_type->tp_free(self); } @@ -176,8 +178,10 @@ static PyObject *pytalloc_base_default_repr(PyObject *obj) static void pytalloc_base_dealloc(PyObject* self) { pytalloc_BaseObject *obj = (pytalloc_BaseObject *)self; - assert(talloc_unlink(NULL, obj->talloc_ctx) != -1); - obj->talloc_ctx = NULL; + if (obj->talloc_ctx != NULL) { + assert(talloc_unlink(NULL, obj->talloc_ctx) != -1); + obj->talloc_ctx = NULL; + } self->ob_type->tp_free(self); } diff --git a/lib/talloc/pytalloc_util.c b/lib/talloc/pytalloc_util.c index 923fe5d634fd..caefc1cab129 100644 --- a/lib/talloc/pytalloc_util.c +++ b/lib/talloc/pytalloc_util.c @@ -103,7 +103,8 @@ _PUBLIC_ PyObject *pytalloc_steal_ex(PyTypeObject *py_type, TALLOC_CTX *mem_ctx, ret->talloc_ctx = talloc_new(NULL); if (ret->talloc_ctx == NULL) { - return NULL; + Py_DECREF(ret); + return PyErr_NoMemory(); } /* @@ -112,7 +113,8 @@ _PUBLIC_ PyObject *pytalloc_steal_ex(PyTypeObject *py_type, TALLOC_CTX *mem_ctx, * talloc_ctx, which is per pytalloc_Object */ if (talloc_steal(ret->talloc_ctx, mem_ctx) == NULL) { - return NULL; + Py_DECREF(ret); + return PyErr_NoMemory(); } ret->talloc_ptr_ctx = mem_ctx; talloc_set_name_const(ret->talloc_ctx, py_type->tp_name); @@ -125,11 +127,13 @@ _PUBLIC_ PyObject *pytalloc_steal_ex(PyTypeObject *py_type, TALLOC_CTX *mem_ctx, ret->talloc_ctx = talloc_new(NULL); if (ret->talloc_ctx == NULL) { - return NULL; + Py_DECREF(ret); + return PyErr_NoMemory(); } if (talloc_steal(ret->talloc_ctx, mem_ctx) == NULL) { - return NULL; + Py_DECREF(ret); + return PyErr_NoMemory(); } talloc_set_name_const(ret->talloc_ctx, py_type->tp_name); ret->ptr = ptr; @@ -177,10 +181,12 @@ _PUBLIC_ PyObject *pytalloc_reference_ex(PyTypeObject *py_type, = (pytalloc_BaseObject *)py_type->tp_alloc(py_type, 0); ret->talloc_ctx = talloc_new(NULL); if (ret->talloc_ctx == NULL) { - return NULL; + Py_DECREF(ret); + return PyErr_NoMemory(); } if (talloc_reference(ret->talloc_ctx, mem_ctx) == NULL) { - return NULL; + Py_DECREF(ret); + return PyErr_NoMemory(); } talloc_set_name_const(ret->talloc_ctx, py_type->tp_name); ret->talloc_ptr_ctx = mem_ctx; @@ -191,10 +197,12 @@ _PUBLIC_ PyObject *pytalloc_reference_ex(PyTypeObject *py_type, = (pytalloc_Object *)py_type->tp_alloc(py_type, 0); ret->talloc_ctx = talloc_new(NULL); if (ret->talloc_ctx == NULL) { - return NULL; + Py_DECREF(ret); + return PyErr_NoMemory(); } if (talloc_reference(ret->talloc_ctx, mem_ctx) == NULL) { - return NULL; + Py_DECREF(ret); + return PyErr_NoMemory(); } talloc_set_name_const(ret->talloc_ctx, py_type->tp_name); ret->ptr = ptr; -- 2.34.1