diff options
author | Stefan Metzmacher <metze@samba.org> | 2006-11-15 16:09:36 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 14:28:13 -0500 |
commit | c046f2e7a35e2cef2c1482f7d6a3f16be45b49d4 (patch) | |
tree | 1df703df31a91e4b2ab398853894ceb1ddae2aeb /source4/lib | |
parent | a39db6303060466ab82366ac9395a6b5a9ca4627 (diff) | |
download | samba-c046f2e7a35e2cef2c1482f7d6a3f16be45b49d4.tar.gz samba-c046f2e7a35e2cef2c1482f7d6a3f16be45b49d4.tar.bz2 samba-c046f2e7a35e2cef2c1482f7d6a3f16be45b49d4.zip |
r19720: - don't pass a pointer reference to ldb_search_default_callback()
as it's ugly when it free's the callers memory on failure!
- only steal the controls on a LDB_REPLY_EXTENDED, LDB_REPLY_DONE
and ignore them on LDB_REPLY_ENTRY, LDB_REPLY_REFERRAL as we currently
have not way to return them in a ldb_result (we should fix this!)
metze
(This used to be commit 47da62b15abf48f97ce6fc8dc4627792728349ae)
Diffstat (limited to 'source4/lib')
-rw-r--r-- | source4/lib/ldb/common/ldb.c | 27 | ||||
-rw-r--r-- | source4/lib/ldb/nssldb/ldb-nss.c | 7 |
2 files changed, 18 insertions, 16 deletions
diff --git a/source4/lib/ldb/common/ldb.c b/source4/lib/ldb/common/ldb.c index 0eacf214b5..9e0ee6ebca 100644 --- a/source4/lib/ldb/common/ldb.c +++ b/source4/lib/ldb/common/ldb.c @@ -532,12 +532,13 @@ int ldb_search_default_callback(struct ldb_context *ldb, void *context, struct l return LDB_ERR_OPERATIONS_ERROR; } - res = *((struct ldb_result **)context); + res = talloc_get_type(context, struct ldb_result); if (!res || !ares) { + ldb_set_errstring(ldb, "NULL res or ares in callback"); goto error; } - + switch (ares->type) { case LDB_REPLY_ENTRY: res->msgs = talloc_realloc(res, res->msgs, struct ldb_message *, res->count + 2); @@ -566,18 +567,15 @@ int ldb_search_default_callback(struct ldb_context *ldb, void *context, struct l res->refs[n + 1] = NULL; case LDB_REPLY_EXTENDED: case LDB_REPLY_DONE: - /* Should do something here to detect if this never - * happens */ + /* TODO: we should really support controls on entries and referrals too! */ + res->controls = talloc_move(res, &ares->controls); break; } - talloc_steal(res, ares->controls); talloc_free(ares); return LDB_SUCCESS; error: talloc_free(ares); - talloc_free(res); - *((struct ldb_result **)context) = NULL; return LDB_ERR_OPERATIONS_ERROR; } @@ -753,16 +751,19 @@ int ldb_search(struct ldb_context *ldb, enum ldb_scope scope, const char *expression, const char * const *attrs, - struct ldb_result **res) + struct ldb_result **_res) { struct ldb_request *req; int ret; + struct ldb_result *res; + + *_res = NULL; - *res = talloc_zero(ldb, struct ldb_result); - if (! *res) { + res = talloc_zero(ldb, struct ldb_result); + if (!res) { return LDB_ERR_OPERATIONS_ERROR; } - + ret = ldb_build_search_req(&req, ldb, ldb, base?base:ldb_get_default_basedn(ldb), scope, @@ -786,10 +787,10 @@ int ldb_search(struct ldb_context *ldb, done: if (ret != LDB_SUCCESS) { - talloc_free(*res); - *res = NULL; + talloc_free(res); } + *_res = res; return ret; } diff --git a/source4/lib/ldb/nssldb/ldb-nss.c b/source4/lib/ldb/nssldb/ldb-nss.c index 3206f38a10..614f6e170f 100644 --- a/source4/lib/ldb/nssldb/ldb-nss.c +++ b/source4/lib/ldb/nssldb/ldb-nss.c @@ -336,7 +336,7 @@ done: #define _LDB_NSS_ALLOC_CHECK(mem) do { if (!mem) { errno = ENOMEM; return NSS_STATUS_UNAVAIL; } } while(0) -NSS_STATUS _ldb_nss_group_request(struct ldb_result **res, +NSS_STATUS _ldb_nss_group_request(struct ldb_result **_res, struct ldb_dn *group_dn, const char * const *attrs, const char *mattr) @@ -346,8 +346,9 @@ NSS_STATUS _ldb_nss_group_request(struct ldb_result **res, struct ldb_asq_control *asqc; struct ldb_request *req; int ret; + struct ldb_result *res = *_res; - ctrls = talloc_array(*res, struct ldb_control *, 2); + ctrls = talloc_array(res, struct ldb_control *, 2); _LDB_NSS_ALLOC_CHECK(ctrls); ctrl = talloc(ctrls, struct ldb_control); @@ -370,7 +371,7 @@ NSS_STATUS _ldb_nss_group_request(struct ldb_result **res, ret = ldb_build_search_req( &req, _ldb_nss_ctx->ldb, - *res, + res, group_dn, LDB_SCOPE_BASE, "(objectClass=*)", |