summaryrefslogtreecommitdiff
path: root/source4/lib/ldb/pyldb.c
diff options
context:
space:
mode:
authorMatthias Dieter Wallnöfer <mdw@samba.org>2010-06-20 18:20:00 +0200
committerMatthias Dieter Wallnöfer <mdw@samba.org>2010-06-20 18:52:27 +0200
commitd7ad7eed24108491bb86271f39ef233826f41352 (patch)
tree1951f266c544a9b5abbeed9800154c0af3b7be5f /source4/lib/ldb/pyldb.c
parent00bf6084817046481e8d049357638387185c39ca (diff)
downloadsamba-d7ad7eed24108491bb86271f39ef233826f41352.tar.gz
samba-d7ad7eed24108491bb86271f39ef233826f41352.tar.bz2
samba-d7ad7eed24108491bb86271f39ef233826f41352.zip
ldb:pyldb.c - introduce a "mem_ctx" also on "py_ldb_search"
To prevent memory leaks
Diffstat (limited to 'source4/lib/ldb/pyldb.c')
-rw-r--r--source4/lib/ldb/pyldb.c31
1 files changed, 19 insertions, 12 deletions
diff --git a/source4/lib/ldb/pyldb.c b/source4/lib/ldb/pyldb.c
index c752b1d5c5..b886a4b81c 100644
--- a/source4/lib/ldb/pyldb.c
+++ b/source4/lib/ldb/pyldb.c
@@ -1116,6 +1116,7 @@ static PyObject *py_ldb_search(PyLdbObject *self, PyObject *args, PyObject *kwar
struct ldb_control **parsed_controls;
struct ldb_dn *base;
PyObject *py_ret;
+ TALLOC_CTX *mem_ctx;
/* type "int" rather than "enum" for "scope" is intentional */
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|OizOO",
@@ -1123,14 +1124,22 @@ static PyObject *py_ldb_search(PyLdbObject *self, PyObject *args, PyObject *kwar
&py_base, &scope, &expr, &py_attrs, &py_controls))
return NULL;
+
+ mem_ctx = talloc_new(NULL);
+ if (mem_ctx == NULL) {
+ PyErr_NoMemory();
+ return NULL;
+ }
ldb_ctx = PyLdb_AsLdbContext(self);
if (py_attrs == Py_None) {
attrs = NULL;
} else {
- attrs = PyList_AsStringList(NULL, py_attrs, "attrs");
- if (attrs == NULL)
+ attrs = PyList_AsStringList(mem_ctx, py_attrs, "attrs");
+ if (attrs == NULL) {
+ talloc_free(mem_ctx);
return NULL;
+ }
}
if (py_base == Py_None) {
@@ -1145,19 +1154,19 @@ static PyObject *py_ldb_search(PyLdbObject *self, PyObject *args, PyObject *kwar
if (py_controls == Py_None) {
parsed_controls = NULL;
} else {
- const char **controls = PyList_AsStringList(ldb_ctx, py_controls, "controls");
- parsed_controls = ldb_parse_control_strings(ldb_ctx, ldb_ctx, controls);
+ const char **controls = PyList_AsStringList(mem_ctx, py_controls, "controls");
+ parsed_controls = ldb_parse_control_strings(ldb_ctx, mem_ctx, controls);
talloc_free(controls);
}
- res = talloc_zero(ldb_ctx, struct ldb_result);
+ res = talloc_zero(mem_ctx, struct ldb_result);
if (res == NULL) {
PyErr_NoMemory();
- talloc_free(attrs);
+ talloc_free(mem_ctx);
return NULL;
}
- ret = ldb_build_search_req(&req, ldb_ctx, ldb_ctx,
+ ret = ldb_build_search_req(&req, ldb_ctx, mem_ctx,
base,
scope,
expr,
@@ -1170,7 +1179,7 @@ static PyObject *py_ldb_search(PyLdbObject *self, PyObject *args, PyObject *kwar
talloc_steal(req, attrs);
if (ret != LDB_SUCCESS) {
- talloc_free(res);
+ talloc_free(mem_ctx);
PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, ldb_ctx);
return NULL;
}
@@ -1181,17 +1190,15 @@ static PyObject *py_ldb_search(PyLdbObject *self, PyObject *args, PyObject *kwar
ret = ldb_wait(req->handle, LDB_WAIT_ALL);
}
- talloc_free(req);
-
if (ret != LDB_SUCCESS) {
- talloc_free(res);
+ talloc_free(mem_ctx);
PyErr_LDB_ERROR_IS_ERR_RAISE(PyExc_LdbError, ret, ldb_ctx);
return NULL;
}
py_ret = PyLdbResult_FromResult(res);
- talloc_free(res);
+ talloc_free(mem_ctx);
return py_ret;
}