From: Andrew Bartlett Date: Mon, 28 May 2018 22:04:29 +0000 (+1200) Subject: ldb: One-level search was incorrectly falling back to full DB scan X-Git-Tag: ldb-1.4.0~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=88ae60ed186c9c479722ad62d65a07d0c2e71469;p=thirdparty%2Fsamba.git 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 --- 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;