talloc: improve pytalloc error code paths if talloc* fails
authorStefan Metzmacher <metze@samba.org>
Tue, 9 May 2017 06:55:55 +0000 (08:55 +0200)
committerStefan Metzmacher <metze@samba.org>
Mon, 18 Feb 2019 11:47:34 +0000 (12:47 +0100)
Signed-off-by: Stefan Metzmacher <metze@samba.org>
lib/talloc/pytalloc.c
lib/talloc/pytalloc_util.c

index 95dbb297a4606f144f5eacb84fe0911e98cfe5c1..05f1206f7665479ac12ecb080add63801253b756 100644 (file)
@@ -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);
 }
 
index 923fe5d634fd0c5f30c574fc06e3dc8788394ea7..caefc1cab1294545dc690c706a5195202602fbbf 100644 (file)
@@ -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;