[SCM] Samba Shared Repository - branch master updated

Andrew Bartlett abartlet at samba.org
Fri Mar 29 18:38:02 UTC 2019


The branch, master has been updated
       via  a2b1970a378 acl_read: Fix regression caused by db15fcfa899e1fe4d6994f68ceb299921b8aa6f1 for empty lists
       via  24efa3ca539 ldb: cmocka test for empty attributes bug
       via  7f1b6455fdc paged_search: perf testing paged search
      from  11f25834203 s3:smbd: fix max_buffer handling of initial notify requests

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit a2b1970a37836e46d6c9eb6bda9bd20185de96ce
Author: Garming Sam <garming at catalyst.net.nz>
Date:   Wed Mar 13 10:52:19 2019 +1300

    acl_read: Fix regression caused by db15fcfa899e1fe4d6994f68ceb299921b8aa6f1 for empty lists
    
    The original code never dereferenced attrs and only added "*" if attrs
    was NULL (not if attrs[0] was NULL).
    
    This causes significant performance issues with the new paged_results
    module introduced for 4.10 as the initial GUID search requests no
    attributes. This GUID search turns into a search for "*" and ends up
    allocating memory for the entire database.
    
    This never appears to cause changes in the final result set, only
    intermediate processing.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13836
    
    Signed-off-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>
    
    Autobuild-User(master): Andrew Bartlett <abartlet at samba.org>
    Autobuild-Date(master): Fri Mar 29 18:37:29 UTC 2019 on sn-devel-144

commit 24efa3ca5399d5cf538c3be504014a954685f1ed
Author: Aaron Haslett <aaronhaslett at catalyst.net.nz>
Date:   Mon Mar 25 13:13:33 2019 +1300

    ldb: cmocka test for empty attributes bug
    
    Cmocka test exposing LDB bug where a request with an empty attributes
    list returns a response containing all attributes.  The bug is in the
    ACL module and will be fixed in the next commit.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13836
    
    Signed-off-by: Aaron Haslett <aaronhaslett at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

commit 7f1b6455fdc1d7767bdfd3dc81851abb682cc087
Author: Aaron Haslett <aaronhaslett at catalyst.net.nz>
Date:   Thu Mar 28 15:03:17 2019 +1300

    paged_search: perf testing paged search
    
    Adding medley performance run with paged search module.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13836
    
    Signed-off-by: Aaron Haslett <aaronhaslett at catalyst.net.nz>
    Reviewed-by: Garming Sam <garming at catalyst.net.nz>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 selftest/perf_tests.py                             | 17 ++++
 source4/dsdb/common/tests/dsdb.c                   | 93 ++++++++++++++++++++++
 source4/dsdb/samdb/ldb_modules/acl_read.c          |  3 -
 .../dsdb/tests/python/ad_dc_medley_performance.py  | 11 ++-
 source4/selftest/tests.py                          |  3 +
 source4/torture/wscript_build                      |  9 +++
 6 files changed, 131 insertions(+), 5 deletions(-)
 create mode 100644 source4/dsdb/common/tests/dsdb.c


Changeset truncated at 500 lines:

diff --git a/selftest/perf_tests.py b/selftest/perf_tests.py
index bc08075c6d1..a3fdbf4b1b3 100644
--- a/selftest/perf_tests.py
+++ b/selftest/perf_tests.py
@@ -74,6 +74,11 @@ plantestsuite_loadlist("samba4.ldb.multi_connect.python(ad_dc_ntvfs)",
                         'tdb://$PREFIX_ABS/ad_dc_ntvfs/private/sam.ldb'
                         '$LOADLIST', '$LISTOPT'])
 
+plantestsuite_loadlist("samba4.ldap.vlv.python(ad_dc_ntvfs)", "ad_dc_ntvfs",
+                       [python,
+                        os.path.join(samba4srcdir, "dsdb/tests/python/vlv.py"),
+                        '$SERVER', '-U"$USERNAME%$PASSWORD"',
+                        '--workgroup=$DOMAIN', '$LOADLIST', '$LISTOPT'])
 
 # this one doesn't tidy itself up fully, so leave it as last unless
 # you want a messy database.
@@ -85,3 +90,15 @@ plantestsuite_loadlist("samba4.ldap.ad_dc_medley_performance.python(ad_dc_ntvfs)
                         '$SERVER', '-U"$USERNAME%$PASSWORD"',
                         '--workgroup=$DOMAIN',
                         '$LOADLIST', '$LISTOPT'])
+
+# again with paged search module
+plantestsuite_loadlist("samba4.ldap.ad_dc_medley_performance.paged_search."+\
+                           "python(ad_dc_ntvfs)",
+                       "ad_dc_ntvfs",
+                       [python,
+                        os.path.join(samba4srcdir,
+                              "dsdb/tests/python/ad_dc_medley_performance.py"),
+                        '$SERVER', '-U"$USERNAME%$PASSWORD"',
+                        '--workgroup=$DOMAIN',
+                        '--use-paged-search',
+                        '$LOADLIST', '$LISTOPT'])
diff --git a/source4/dsdb/common/tests/dsdb.c b/source4/dsdb/common/tests/dsdb.c
new file mode 100644
index 00000000000..b38dee1c262
--- /dev/null
+++ b/source4/dsdb/common/tests/dsdb.c
@@ -0,0 +1,93 @@
+/*
+   Unix SMB/CIFS implementation.
+
+   Test DSDB search
+
+   Copyright (C) Andrew Bartlet <abartlet at samba.org> 2019
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include <ldb_module.h>
+#include "ldb_wrap.h"
+#include "param/param.h"
+#include "param/loadparm.h"
+#include "torture/smbtorture.h"
+#include "torture/dsdb_proto.h"
+#include "auth/auth.h"
+
+bool torture_ldb_no_attrs(struct torture_context *torture)
+{
+	struct ldb_context *ldb;
+	int ret;
+	struct ldb_request *req;
+	struct ldb_result *ctx;
+	struct ldb_dn *dn;
+	const char *attrs[] = { NULL };
+
+	struct auth_session_info *session;
+	struct dom_sid *domain_sid = NULL;
+	const char *path;
+
+	path = lpcfg_private_path(NULL, torture->lp_ctx, "sam.ldb");
+	torture_assert(torture, path != NULL,
+		       "Couldn't find sam.ldb. Run with -s $SERVERCONFFILE");
+
+	domain_sid = dom_sid_parse_talloc(NULL, SID_BUILTIN);
+	session = admin_session(NULL, torture->lp_ctx, domain_sid);
+	ldb = ldb_wrap_connect(torture, torture->ev, torture->lp_ctx,
+			       path, session, NULL, 0);
+	torture_assert(torture, ldb, "Failed to connect to LDB target");
+
+	ctx = talloc_zero(ldb, struct ldb_result);
+
+	dn = ldb_get_default_basedn(ldb);
+	ldb_dn_add_child_fmt(dn, "cn=users");
+	ret = ldb_build_search_req(&req, ldb, ctx, dn, LDB_SCOPE_SUBTREE,
+				   "(objectClass=*)", attrs, NULL,
+				   ctx, ldb_search_default_callback, NULL);
+	torture_assert(torture, ret == LDB_SUCCESS,
+		       "Failed to build search request");
+	ldb_req_mark_untrusted(req);
+
+	ret = ldb_request(ldb, req);
+	torture_assert(torture, ret == LDB_SUCCESS, ldb_errstring(ldb));
+
+	ret = ldb_wait(req->handle, LDB_WAIT_ALL);
+	torture_assert(torture, ret == LDB_SUCCESS, ldb_errstring(ldb));
+
+	torture_assert(torture, ctx->count > 0, "Users container empty");
+	torture_assert_int_equal(torture, ctx->msgs[0]->num_elements, 0,
+				 "Attributes returned for request "
+				 "with empty attribute list");
+
+	return true;
+}
+
+NTSTATUS torture_dsdb_init(TALLOC_CTX *mem_ctx)
+{
+	struct torture_suite *suite = torture_suite_create(mem_ctx, "dsdb");
+
+	if (suite == NULL) {
+		return NT_STATUS_NO_MEMORY;
+	}
+	torture_suite_add_simple_test(suite, "no_attrs", torture_ldb_no_attrs);
+
+	suite->description = talloc_strdup(suite, "DSDB tests");
+
+	torture_register_suite(mem_ctx, suite);
+
+	return NT_STATUS_OK;
+}
diff --git a/source4/dsdb/samdb/ldb_modules/acl_read.c b/source4/dsdb/samdb/ldb_modules/acl_read.c
index 5a193e6d925..1e016b970ee 100644
--- a/source4/dsdb/samdb/ldb_modules/acl_read.c
+++ b/source4/dsdb/samdb/ldb_modules/acl_read.c
@@ -797,9 +797,6 @@ static int aclread_search(struct ldb_module *module, struct ldb_request *req)
 	if (attrs == NULL) {
 		all_attrs = true;
 		attrs = _all_attrs;
-	} else if (attrs[0] == NULL) {
-		all_attrs = true;
-		attrs = _all_attrs;
 	} else if (ldb_attr_in_list(attrs, "*")) {
 		all_attrs = true;
 	}
diff --git a/source4/dsdb/tests/python/ad_dc_medley_performance.py b/source4/dsdb/tests/python/ad_dc_medley_performance.py
index 1be8ef6ce39..e0f0e19651a 100644
--- a/source4/dsdb/tests/python/ad_dc_medley_performance.py
+++ b/source4/dsdb/tests/python/ad_dc_medley_performance.py
@@ -42,6 +42,9 @@ from ldb import ERR_NO_SUCH_OBJECT
 
 parser = optparse.OptionParser("ad_dc_performance.py [options] <host>")
 sambaopts = options.SambaOptions(parser)
+sambaopts.add_option("-p", "--use-paged-search", action="store_true",
+                     help="Use paged search module")
+
 parser.add_option_group(sambaopts)
 parser.add_option_group(options.VersionOptions(parser))
 
@@ -54,7 +57,6 @@ credopts = options.CredentialsOptions(parser)
 parser.add_option_group(credopts)
 opts, args = parser.parse_args()
 
-
 if len(args) < 1:
     parser.print_usage()
     sys.exit(1)
@@ -103,8 +105,13 @@ class UserTests(samba.tests.TestCase):
         super(UserTests, self).setUp()
         self.state = GlobalState  # the class itself, not an instance
         self.lp = lp
+
+        kwargs = {}
+        if opts.use_paged_search:
+            kwargs["options"] = ["modules:paged_searches"]
+
         self.ldb = SamDB(host, credentials=creds,
-                         session_info=system_session(lp), lp=lp)
+                         session_info=system_session(lp), lp=lp, **kwargs)
         self.base_dn = self.ldb.domain_dn()
         self.ou = "OU=pid%s,%s" % (os.getpid(), self.base_dn)
         self.ou_users = "OU=users,%s" % self.ou
diff --git a/source4/selftest/tests.py b/source4/selftest/tests.py
index 5a3f69f232d..7e0ce96c45c 100755
--- a/source4/selftest/tests.py
+++ b/source4/selftest/tests.py
@@ -152,6 +152,9 @@ for options in ['-U"$USERNAME%$PASSWORD"']:
 for t in smbtorture4_testsuites("ldap."):
     plansmbtorture4testsuite(t, "ad_dc_default", '-U"$USERNAME%$PASSWORD" //$SERVER_IP/_none_')
 
+for t in smbtorture4_testsuites("dsdb."):
+    plansmbtorture4testsuite(t, "ad_dc:local", "localhost")
+
 ldbdir = os.path.join(srcdir(), "lib/ldb")
 # Don't run LDB tests when using system ldb, as we won't have ldbtest installed
 if os.path.exists(os.path.join(samba4bindir, "ldbtest")):
diff --git a/source4/torture/wscript_build b/source4/torture/wscript_build
index 09904134d3e..0189300aca9 100644
--- a/source4/torture/wscript_build
+++ b/source4/torture/wscript_build
@@ -344,3 +344,12 @@ bld.SAMBA_BINARY('locktest',
 	deps='popt POPT_SAMBA POPT_CREDENTIALS samba-util LIBCLI_SMB samba-hostconfig param_options',
 	)
 
+bld.SAMBA_MODULE('TORTURE_DSDB',
+	source="../../source4/dsdb/common/tests/dsdb.c",
+	autoproto='dsdb_proto.h',
+	subsystem='smbtorture',
+	init_function='torture_dsdb_init',
+	deps="TORTURE_UTIL samba-util",
+	internal_module=True,
+	enabled=bld.PYTHON_BUILD_IS_ENABLED()
+	)


-- 
Samba Shared Repository



More information about the samba-cvs mailing list