summaryrefslogtreecommitdiffstats
path: root/lib/ntdb
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@samba.org>2013-12-01 23:20:34 +0000
committerAndrew Bartlett <abartlet@samba.org>2013-12-06 05:21:03 +0100
commit4111f31eac942fb243b3baa41a95914a4c8587c2 (patch)
tree0c6f605c2239134af5d27d8f37da207befb42fdb /lib/ntdb
parent28b5b7e28ed5a1b564851e56e8b6b3202d9f1ea9 (diff)
downloadsamba-4111f31eac942fb243b3baa41a95914a4c8587c2.tar.gz
samba-4111f31eac942fb243b3baa41a95914a4c8587c2.tar.xz
samba-4111f31eac942fb243b3baa41a95914a4c8587c2.zip
pyntdb: Don't allow access after a database is closed.
Signed-off-by: Jelmer Vernooij <jelmer@samba.org> Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Diffstat (limited to 'lib/ntdb')
-rw-r--r--lib/ntdb/pyntdb.c70
-rw-r--r--lib/ntdb/wscript13
2 files changed, 77 insertions, 6 deletions
diff --git a/lib/ntdb/pyntdb.c b/lib/ntdb/pyntdb.c
index e4965fbae1..791ab93ae7 100644
--- a/lib/ntdb/pyntdb.c
+++ b/lib/ntdb/pyntdb.c
@@ -72,6 +72,14 @@ static PyObject *PyString_FromNtdb_Data(NTDB_DATA data)
return NULL; \
}
+#define PyNtdb_CHECK_CLOSED(pyobj) \
+ if (pyobj->closed) {\
+ PyErr_SetObject(PyExc_RuntimeError, \
+ Py_BuildValue("(i,s)", NTDB_ERR_EINVAL, "database is closed")); \
+ return NULL; \
+ }
+
+
static void stderr_log(struct ntdb_context *ntdb,
enum ntdb_log_level level,
enum NTDB_ERROR ecode,
@@ -120,53 +128,66 @@ static PyObject *py_ntdb_open(PyTypeObject *type, PyObject *args, PyObject *kwar
static PyObject *obj_transaction_cancel(PyNtdbObject *self)
{
+ PyNtdb_CHECK_CLOSED(self);
ntdb_transaction_cancel(self->ctx);
Py_RETURN_NONE;
}
static PyObject *obj_transaction_commit(PyNtdbObject *self)
{
- enum NTDB_ERROR ret = ntdb_transaction_commit(self->ctx);
+ enum NTDB_ERROR ret;
+ PyNtdb_CHECK_CLOSED(self);
+ ret = ntdb_transaction_commit(self->ctx);
PyErr_NTDB_ERROR_IS_ERR_RAISE(ret);
Py_RETURN_NONE;
}
static PyObject *obj_transaction_prepare_commit(PyNtdbObject *self)
{
- enum NTDB_ERROR ret = ntdb_transaction_prepare_commit(self->ctx);
+ enum NTDB_ERROR ret;
+ PyNtdb_CHECK_CLOSED(self);
+ ret = ntdb_transaction_prepare_commit(self->ctx);
PyErr_NTDB_ERROR_IS_ERR_RAISE(ret);
Py_RETURN_NONE;
}
static PyObject *obj_transaction_start(PyNtdbObject *self)
{
- enum NTDB_ERROR ret = ntdb_transaction_start(self->ctx);
+ enum NTDB_ERROR ret;
+ PyNtdb_CHECK_CLOSED(self);
+ ret = ntdb_transaction_start(self->ctx);
PyErr_NTDB_ERROR_IS_ERR_RAISE(ret);
Py_RETURN_NONE;
}
static PyObject *obj_lockall(PyNtdbObject *self)
{
- enum NTDB_ERROR ret = ntdb_lockall(self->ctx);
+ enum NTDB_ERROR ret;
+ PyNtdb_CHECK_CLOSED(self);
+ ret = ntdb_lockall(self->ctx);
PyErr_NTDB_ERROR_IS_ERR_RAISE(ret);
Py_RETURN_NONE;
}
static PyObject *obj_unlockall(PyNtdbObject *self)
{
+ PyNtdb_CHECK_CLOSED(self);
ntdb_unlockall(self->ctx);
Py_RETURN_NONE;
}
static PyObject *obj_lockall_read(PyNtdbObject *self)
{
- enum NTDB_ERROR ret = ntdb_lockall_read(self->ctx);
+ enum NTDB_ERROR ret;
+ PyNtdb_CHECK_CLOSED(self);
+ ret = ntdb_lockall_read(self->ctx);
PyErr_NTDB_ERROR_IS_ERR_RAISE(ret);
Py_RETURN_NONE;
}
static PyObject *obj_unlockall_read(PyNtdbObject *self)
{
+ PyNtdb_CHECK_CLOSED(self);
ntdb_unlockall_read(self->ctx);
Py_RETURN_NONE;
}
@@ -190,6 +211,9 @@ static PyObject *obj_get(PyNtdbObject *self, PyObject *args)
NTDB_DATA key, data;
PyObject *py_key;
enum NTDB_ERROR ret;
+
+ PyNtdb_CHECK_CLOSED(self);
+
if (!PyArg_ParseTuple(args, "O", &py_key))
return NULL;
@@ -206,6 +230,9 @@ static PyObject *obj_append(PyNtdbObject *self, PyObject *args)
NTDB_DATA key, data;
PyObject *py_key, *py_data;
enum NTDB_ERROR ret;
+
+ PyNtdb_CHECK_CLOSED(self);
+
if (!PyArg_ParseTuple(args, "OO", &py_key, &py_data))
return NULL;
@@ -222,6 +249,8 @@ static PyObject *obj_firstkey(PyNtdbObject *self)
enum NTDB_ERROR ret;
NTDB_DATA key;
+ PyNtdb_CHECK_CLOSED(self);
+
ret = ntdb_firstkey(self->ctx, &key);
if (ret == NTDB_ERR_NOEXIST)
Py_RETURN_NONE;
@@ -235,6 +264,9 @@ static PyObject *obj_nextkey(PyNtdbObject *self, PyObject *args)
NTDB_DATA key;
PyObject *py_key;
enum NTDB_ERROR ret;
+
+ PyNtdb_CHECK_CLOSED(self);
+
if (!PyArg_ParseTuple(args, "O", &py_key))
return NULL;
@@ -256,6 +288,9 @@ static PyObject *obj_delete(PyNtdbObject *self, PyObject *args)
NTDB_DATA key;
PyObject *py_key;
enum NTDB_ERROR ret;
+
+ PyNtdb_CHECK_CLOSED(self);
+
if (!PyArg_ParseTuple(args, "O", &py_key))
return NULL;
@@ -269,6 +304,9 @@ static PyObject *obj_has_key(PyNtdbObject *self, PyObject *args)
{
NTDB_DATA key;
PyObject *py_key;
+
+ PyNtdb_CHECK_CLOSED(self);
+
if (!PyArg_ParseTuple(args, "O", &py_key))
return NULL;
@@ -284,6 +322,7 @@ static PyObject *obj_store(PyNtdbObject *self, PyObject *args)
enum NTDB_ERROR ret;
int flag = NTDB_REPLACE;
PyObject *py_key, *py_value;
+ PyNtdb_CHECK_CLOSED(self);
if (!PyArg_ParseTuple(args, "OO|i", &py_key, &py_value, &flag))
return NULL;
@@ -299,6 +338,7 @@ static PyObject *obj_store(PyNtdbObject *self, PyObject *args)
static PyObject *obj_add_flag(PyNtdbObject *self, PyObject *args)
{
unsigned flag;
+ PyNtdb_CHECK_CLOSED(self);
if (!PyArg_ParseTuple(args, "I", &flag))
return NULL;
@@ -311,6 +351,8 @@ static PyObject *obj_remove_flag(PyNtdbObject *self, PyObject *args)
{
unsigned flag;
+ PyNtdb_CHECK_CLOSED(self);
+
if (!PyArg_ParseTuple(args, "I", &flag))
return NULL;
@@ -360,6 +402,7 @@ static PyObject *ntdb_object_iter(PyNtdbObject *self)
{
PyNtdbIteratorObject *ret;
enum NTDB_ERROR e;
+ PyNtdb_CHECK_CLOSED(self);
ret = PyObject_New(PyNtdbIteratorObject, &PyNtdbIterator);
if (!ret)
@@ -378,13 +421,16 @@ static PyObject *ntdb_object_iter(PyNtdbObject *self)
static PyObject *obj_clear(PyNtdbObject *self)
{
- enum NTDB_ERROR ret = ntdb_wipe_all(self->ctx);
+ enum NTDB_ERROR ret;
+ PyNtdb_CHECK_CLOSED(self);
+ ret = ntdb_wipe_all(self->ctx);
PyErr_NTDB_ERROR_IS_ERR_RAISE(ret);
Py_RETURN_NONE;
}
static PyObject *obj_enable_seqnum(PyNtdbObject *self)
{
+ PyNtdb_CHECK_CLOSED(self);
ntdb_add_flag(self->ctx, NTDB_SEQNUM);
Py_RETURN_NONE;
}
@@ -433,16 +479,19 @@ static PyMethodDef ntdb_object_methods[] = {
static PyObject *obj_get_flags(PyNtdbObject *self, void *closure)
{
+ PyNtdb_CHECK_CLOSED(self);
return PyInt_FromLong(ntdb_get_flags(self->ctx));
}
static PyObject *obj_get_filename(PyNtdbObject *self, void *closure)
{
+ PyNtdb_CHECK_CLOSED(self);
return PyString_FromString(ntdb_name(self->ctx));
}
static PyObject *obj_get_seqnum(PyNtdbObject *self, void *closure)
{
+ PyNtdb_CHECK_CLOSED(self);
return PyInt_FromLong(ntdb_get_seqnum(self->ctx));
}
@@ -476,6 +525,8 @@ static PyObject *obj_getitem(PyNtdbObject *self, PyObject *key)
NTDB_DATA tkey, val;
enum NTDB_ERROR ret;
+ PyNtdb_CHECK_CLOSED(self);
+
if (!PyString_Check(key)) {
PyErr_SetString(PyExc_TypeError, "Expected string as key");
return NULL;
@@ -498,6 +549,12 @@ static int obj_setitem(PyNtdbObject *self, PyObject *key, PyObject *value)
{
NTDB_DATA tkey, tval;
enum NTDB_ERROR ret;
+ if (self->closed) {
+ PyErr_SetObject(PyExc_RuntimeError,
+ Py_BuildValue("(i,s)", NTDB_ERR_EINVAL, "database is closed"));
+ return -1;
+ }
+
if (!PyString_Check(key)) {
PyErr_SetString(PyExc_TypeError, "Expected string as key");
return -1;
@@ -530,6 +587,7 @@ static PyMappingMethods ntdb_object_mapping = {
.mp_subscript = (binaryfunc)obj_getitem,
.mp_ass_subscript = (objobjargproc)obj_setitem,
};
+
static PyTypeObject PyNtdb = {
.tp_name = "ntdb.Ntdb",
.tp_basicsize = sizeof(PyNtdbObject),
diff --git a/lib/ntdb/wscript b/lib/ntdb/wscript
index de67615446..d4828b02fb 100644
--- a/lib/ntdb/wscript
+++ b/lib/ntdb/wscript
@@ -92,6 +92,7 @@ def configure(conf):
'test/api-record-expand.c',
'test/api-simple-delete.c',
'test/api-summary.c']
+ conf.env.NTDB_TEST_API_PY=['test/python-api.py']
conf.env.NTDB_TEST_API_HELPER_SRC=['test/helpapi-external-agent.c']
conf.env.NTDB_TEST_RUN_HELPER_SRC=['test/helprun-external-agent.c',
'test/helprun-layout.c']
@@ -253,6 +254,18 @@ def testonly(ctx):
samba_utils.RUN_COMMAND("cat " + os.path.join(testdir, 'test-output'))
ecode = ret;
break;
+ if not env.disable_python:
+ for f in env.NTDB_TEST_API_PY:
+ print("..." + f)
+ cmd = "cd " + testdir + " && PYTHONPATH=%s %s %s" % (
+ os.path.abspath(os.path.join(Utils.g_module.blddir, "python")),
+ env["PYTHON"], os.path.abspath(f))
+ print cmd
+ ret = samba_utils.RUN_COMMAND(cmd)
+ if ret != 0:
+ print("%s (%s) failed:" % (name, f))
+ ecode = ret
+ break
sys.exit(ecode)