From 88ae60ed186c9c479722ad62d65a07d0c2e71469 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Tue, 29 May 2018 10:04:29 +1200 Subject: [PATCH] ldb: One-level search was incorrectly falling back to full DB scan When no search filter is specified, the code falls back to using '(|(objectClass=*)(distinguishedName=*)'. ltdb_index_dn() then failed because matching against '*' is not indexed. The error return then caused the code to fallback to a full-scan of the DB, which could have a considerable performance hit. Instead, we want to continue on and do the ltdb_index_filter() over the indexed results that were returned. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13448 Signed-off-by: Tim Beale Signed-off-by: Andrew Bartlett Reviewed-by: Garming Sam --- lib/ldb/ldb_tdb/ldb_index.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/lib/ldb/ldb_tdb/ldb_index.c b/lib/ldb/ldb_tdb/ldb_index.c index 041dbdc4ed6..7bd843effbe 100644 --- a/lib/ldb/ldb_tdb/ldb_index.c +++ b/lib/ldb/ldb_tdb/ldb_index.c @@ -1994,20 +1994,21 @@ int ltdb_search_indexed(struct ltdb_context *ac, uint32_t *match_count) } /* * Here we load the index for the tree. + * + * We only care if this is successful, if the + * index can't trim the result list down then + * the ONELEVEL index is still good enough. */ ret = ltdb_index_dn(ac->module, ltdb, ac->tree, idx_one_tree_list); - if (ret != LDB_SUCCESS) { - talloc_free(idx_one_tree_list); - talloc_free(dn_list); - return ret; - } - - if (!list_intersect(ldb, ltdb, - dn_list, idx_one_tree_list)) { - talloc_free(idx_one_tree_list); - talloc_free(dn_list); - return LDB_ERR_OPERATIONS_ERROR; + if (ret == LDB_SUCCESS) { + if (!list_intersect(ldb, ltdb, + dn_list, + idx_one_tree_list)) { + talloc_free(idx_one_tree_list); + talloc_free(dn_list); + return LDB_ERR_OPERATIONS_ERROR; + } } } break; -- 2.47.2