Make sure to not close tdb database more than once. (cherry picked from samba commit...
authorJelmer Vernooij <jelmer@samba.org>
Thu, 18 Dec 2008 20:42:50 +0000 (20:42 +0000)
committerStefan Metzmacher <metze@samba.org>
Wed, 16 Dec 2009 07:03:51 +0000 (08:03 +0100)
Signed-off-by: Stefan Metzmacher <metze@samba.org>
lib/tdb/pytdb.c

index d6d0625686f1dc31ec0360e35d2f898548d59e69..b7087c4bcc5ca0af5e4f31242bd199bf88f130d9 100644 (file)
 #include <signal.h>
 #include <tdb.h>
 #include <fcntl.h>
+#include <stdbool.h>
 
 typedef struct {
        PyObject_HEAD
        TDB_CONTEXT *ctx;
+       bool closed;
 } PyTdbObject;
 
 PyAPI_DATA(PyTypeObject) PyTdb;
@@ -93,6 +95,7 @@ static PyObject *py_tdb_open(PyTypeObject *type, PyObject *args, PyObject *kwarg
 
        ret = PyObject_New(PyTdbObject, &PyTdb);
        ret->ctx = ctx;
+       ret->closed = false;
        return (PyObject *)ret;
 }
 
@@ -161,7 +164,11 @@ static PyObject *obj_unlockall_read(PyTdbObject *self)
 
 static PyObject *obj_close(PyTdbObject *self)
 {
-       int ret = tdb_close(self->ctx);
+       int ret;
+       if (self->closed)
+               return Py_None;
+       ret = tdb_close(self->ctx);
+       self->closed = true;
        PyErr_TDB_ERROR_IS_ERR_RAISE(ret, self->ctx);
        return Py_None;
 }
@@ -395,7 +402,8 @@ static PyObject *tdb_object_repr(PyTdbObject *self)
 
 static void tdb_object_dealloc(PyTdbObject *self)
 {
-       tdb_close(self->ctx);
+       if (!self->closed)
+               tdb_close(self->ctx);
        PyObject_Del(self);
 }