ldb: Fix search with scope ONE and small result sets
authorAndrew Bartlett <abartlet@samba.org>
Fri, 7 Feb 2020 03:56:13 +0000 (16:56 +1300)
committerKarolin Seeger <kseeger@samba.org>
Tue, 25 Feb 2020 19:32:28 +0000 (19:32 +0000)
This changes the LDB behaviour in the combination of a SCOPE_ONE search and
an index returning less than 10 results.

After b6b5b5fe355fee2a4096e9214831cb88c7a2a4c6 the list->strict flag
became set to false in all cases, rather than being left to the
value set by the caller.

This changes the ldb_kv_index_dn_one() code to force strict
mode on success instead.

Thanks to Marcus GranĂ©r, ICEYE Oy for reporting.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=14270

Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
(cherry picked from commit 3c7261c43da491b57f50e0e64d7050d85c6b973e)

lib/ldb/ldb_key_value/ldb_kv_index.c

index 059abef67489e40e41f0f9652e5683c51a3b7bd0..a7e341552ea3fa67361b9e762e289965fb3dd2d1 100644 (file)
@@ -2113,16 +2113,19 @@ static int ldb_kv_index_dn_one(struct ldb_module *module,
                               struct dn_list *list,
                               enum key_truncation *truncation)
 {
-       /*
-        * Ensure we do not shortcut on intersection for this list.
-        * We must never be lazy and return an entry not in this
-        * list.  This allows the index for
-        * SCOPE_ONELEVEL to be trusted.
-        */
-
-       list->strict = true;
-       return ldb_kv_index_dn_attr(
+       int ret = ldb_kv_index_dn_attr(
            module, ldb_kv, LDB_KV_IDXONE, parent_dn, list, truncation);
+       if (ret == LDB_SUCCESS) {
+               /*
+                * Ensure we do not shortcut on intersection for this
+                * list.  We must never be lazy and return an entry
+                * not in this list.  This allows the index for
+                * SCOPE_ONELEVEL to be trusted.
+                */
+
+               list->strict = true;
+       }
+       return ret;
 }
 
 /*