From ed3d8091ce2b2014350a2f7f22202dde6846a130 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 18 Jun 2005 07:42:21 +0000 Subject: r7709: - convert ldb to use popt, so that it can interact with the samba cmdline credentials code (which will be done soon) - added a ldb_init() call, and changed ldb_connect() to take a ldb context. This allows for much better error handling in ldb_connect(), and also made the popt conversion easier - fixed up all the existing backends with the new syntax - improved error handling in *_connect() - fixed a crash bug in the new case_fold_required() code - ensured that ltdb_rename() and all ltdb_search() paths get the read lock - added a ldb_oom() macro to make it easier to report out of memory situations in ldb code (This used to be commit f648fdf187669d6d87d01dd4e786b03cd420f220) --- source4/lib/ldb/ldb_tdb/ldb_search.c | 38 ++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) (limited to 'source4/lib/ldb/ldb_tdb/ldb_search.c') diff --git a/source4/lib/ldb/ldb_tdb/ldb_search.c b/source4/lib/ldb/ldb_tdb/ldb_search.c index 3644d046e0..d6e7d66f68 100644 --- a/source4/lib/ldb/ldb_tdb/ldb_search.c +++ b/source4/lib/ldb/ldb_tdb/ldb_search.c @@ -272,44 +272,63 @@ int ltdb_search_dn1(struct ldb_module *module, const char *dn, struct ldb_messag /* search the database for a single simple dn */ -int ltdb_search_dn(struct ldb_module *module, const char *dn, - const char * const attrs[], struct ldb_message ***res) +static int ltdb_search_dn(struct ldb_module *module, const char *dn, + const char * const attrs[], struct ldb_message ***res) { struct ldb_context *ldb = module->ldb; + struct ltdb_private *ltdb = module->private_data; int ret; struct ldb_message *msg, *msg2; + *res = NULL; + + if (ltdb_lock_read(module) != 0) { + return -1; + } + + ltdb->last_err_string = NULL; + + if (ltdb_cache_load(module) != 0) { + ltdb_unlock_read(module); + return -1; + } + *res = talloc_array(ldb, struct ldb_message *, 2); if (! *res) { - return -1; + goto failed; } msg = talloc(*res, struct ldb_message); if (msg == NULL) { - talloc_free(*res); - *res = NULL; - return -1; + goto failed; } ret = ltdb_search_dn1(module, dn, msg); if (ret != 1) { talloc_free(*res); *res = NULL; - return ret; + ltdb_unlock_read(module); + return 0; } msg2 = ltdb_pull_attrs(module, msg, attrs); talloc_free(msg); - if (!msg2) { - return -1; + goto failed; } (*res)[0] = talloc_steal(*res, msg2); (*res)[1] = NULL; + ltdb_unlock_read(module); + return 1; + +failed: + talloc_free(*res); + ltdb_unlock_read(module); + return -1; } @@ -508,7 +527,6 @@ int ltdb_search(struct ldb_module *module, const char *base, /* check if we are looking for a simple dn */ if (scope == LDB_SCOPE_BASE && (expression == NULL || expression[0] == '\0')) { ret = ltdb_search_dn(module, base, attrs, res); - ltdb_unlock_read(module); return ret; } -- cgit