>From 31aa41e02d8204f65e92409ed0b562deeb6cca39 Mon Sep 17 00:00:00 2001 From: Douglas Bagnall Date: Thu, 16 Feb 2017 16:41:00 +1300 Subject: [PATCH 1/4] selftest: ndr_pack/unpack performance test This just does a lot of packing and unpacking of various structures. Signed-off-by: Douglas Bagnall --- selftest/perf_tests.py | 8 + source4/dsdb/tests/python/ndr_pack_performance.py | 227 ++++++++++++++++++++++ testdata/replication-ndrpack-example.gz | Bin 0 -> 132871 bytes 3 files changed, 235 insertions(+) create mode 100644 source4/dsdb/tests/python/ndr_pack_performance.py create mode 100644 testdata/replication-ndrpack-example.gz diff --git a/selftest/perf_tests.py b/selftest/perf_tests.py index 091349b..113170c 100644 --- a/selftest/perf_tests.py +++ b/selftest/perf_tests.py @@ -25,6 +25,14 @@ plantestsuite_loadlist("samba4.ldap.ad_dc_performance.python(ad_dc_ntvfs)", '--workgroup=$DOMAIN', '$LOADLIST', '$LISTOPT']) +plantestsuite_loadlist("samba4.ndr_pack_performance.python(ad_dc_ntvfs)", + "ad_dc_ntvfs", + [python, os.path.join(samba4srcdir, + "dsdb/tests/python/ndr_pack_performance.py"), + '$SERVER', '-U"$USERNAME%$PASSWORD"', + '--workgroup=$DOMAIN', + '$LOADLIST', '$LISTOPT']) + plantestsuite_loadlist("samba4.ldap.ad_dc_multi_bind.ntlm.python(ad_dc_ntvfs)", "ad_dc_ntvfs", [python, os.path.join(samba4srcdir, diff --git a/source4/dsdb/tests/python/ndr_pack_performance.py b/source4/dsdb/tests/python/ndr_pack_performance.py new file mode 100644 index 0000000..9ce0d4c --- /dev/null +++ b/source4/dsdb/tests/python/ndr_pack_performance.py @@ -0,0 +1,227 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +import optparse +import sys +sys.path.insert(0, 'bin/python') + +import os +import samba +import samba.getopt as options +import random +import tempfile +import shutil +import time +import gzip + +from samba.netcmd.main import cmd_sambatool + +# We try to use the test infrastructure of Samba 4.3+, but if it +# doesn't work, we are probably in a back-ported patch and trying to +# run on 4.1 or something. +# +# Don't copy this horror into ordinary tests -- it is special for +# performance tests that want to apply to old versions. +try: + from samba.tests.subunitrun import SubunitOptions, TestProgram + ANCIENT_SAMBA = False +except ImportError: + ANCIENT_SAMBA = True + samba.ensure_external_module("testtools", "testtools") + samba.ensure_external_module("subunit", "subunit/python") + from subunit.run import SubunitTestRunner + import unittest + +from samba.samdb import SamDB +from samba.auth import system_session + +from samba.ndr import ndr_pack, ndr_unpack +from samba.dcerpc import security +from samba.dcerpc import drsuapi + +parser = optparse.OptionParser("ndr_pack_performance.py [options] ") +sambaopts = options.SambaOptions(parser) +parser.add_option_group(sambaopts) +parser.add_option_group(options.VersionOptions(parser)) + +if not ANCIENT_SAMBA: + subunitopts = SubunitOptions(parser) + parser.add_option_group(subunitopts) + +# use command line creds if available +credopts = options.CredentialsOptions(parser) +parser.add_option_group(credopts) +opts, args = parser.parse_args() + +if len(args) < 1: + parser.print_usage() + sys.exit(1) + +host = args[0] + +lp = sambaopts.get_loadparm() +creds = credopts.get_credentials(lp) + +random.seed(1) + + +BIG_SD_SDDL = ''.join( +"""O:S-1-5-21-3328325300-3937145445-4190589019-512G:S-1-5-2 +1-3328325300-3937145445-4190589019-512D:AI(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;S- +1-5-21-3328325300-3937145445-4190589019-512)(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;; +SY)(A;;RPLCLORC;;;AU)(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;AO)(A;;RPLCLORC;;;PS)(O +A;;CR;ab721a55-1e2f-11d0-9819-00aa0040529b;;AU)(OA;;RP;46a9b11d-60ae-405a-b7e +8-ff8a58d456d2;;S-1-5-32-560)(OA;CIIOID;RP;4c164200-20c0-11d0-a768-00aa006e05 +29;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;4c164200-20c0-11d0-a +768-00aa006e0529;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;5f2020 +10-79a5-11d0-9020-00c04fc2d4cf;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CI +IOID;RP;5f202010-79a5-11d0-9020-00c04fc2d4cf;bf967aba-0de6-11d0-a285-00aa0030 +49e2;RU)(OA;CIIOID;RP;bc0ac240-79a9-11d0-9020-00c04fc2d4cf;4828cc14-1437-45bc +-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;bc0ac240-79a9-11d0-9020-00c04fc2d4cf;bf96 +7aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;59ba2f42-79a2-11d0-9020-00c +04fc2d3cf;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;59ba2f42-79a2 +-11d0-9020-00c04fc2d3cf;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP +;037088f8-0ae1-11d2-b422-00a0c968f939;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU +)(OA;CIIOID;RP;037088f8-0ae1-11d2-b422-00a0c968f939;bf967aba-0de6-11d0-a285-0 +0aa003049e2;RU)(OA;CIIOID;RP;b7c69e6d-2cc7-11d2-854e-00a0c983f608;bf967a86-0d +e6-11d0-a285-00aa003049e2;ED)(OA;CIID;RP;b7c69e6d-2cc7-11d2-854e-00a0c983f608 +;bf967a9c-0de6-11d0-a285-00aa003049e2;ED)(OA;CIIOID;RP;b7c69e6d-2cc7-11d2-854 +e-00a0c983f608;bf967aba-0de6-11d0-a285-00aa003049e2;ED)(OA;CIIOID;RPLCLORC;;4 +828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIID;RPLCLORC;;bf967a9c-0de6-11d0- +a285-00aa003049e2;RU)(OA;CIIOID;RPLCLORC;;bf967aba-0de6-11d0-a285-00aa003049e +2;RU)(OA;CIID;RPWPCR;91e647de-d96f-4b70-9557-d63ff4f3ccd8;;PS)(A;CIID;RPWPCRC +CDCLCLORCWOWDSDDTSW;;;S-1-5-21-3328325300-3937145445-4190589019-519)(A;CIID;L +C;;;RU)(A;CIID;RPWPCRCCLCLORCWOWDSDSW;;;BA)(OA;CIIOID;RP;4c164200-20c0-11d0-a +768-00aa006e0529;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;4c1642 +00-20c0-11d0-a768-00aa006e0529;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CI +IOID;RP;5f202010-79a5-11d0-9020-00c04fc2d4cf;4828cc14-1437-45bc-9b07-ad6f015e +5f28;RU)(OA;CIIOID;RP;5f202010-79a5-11d0-9020-00c04fc2d4cf;bf967aba-0de6-11d0 +-a285-00aa003049e2;RU)(OA;CIIOID;RP;bc0ac240-79a9-11d0-9020-00c04fc2d4cf;4828 +cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;bc0ac240-79a9-11d0-9020-00c +04fc2d4cf;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;59ba2f42-79a2 +-11d0-9020-00c04fc2d3cf;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP +;59ba2f42-79a2-11d0-9020-00c04fc2d3cf;bf967aba-0de6-11d0-a285-00aa003049e2;RU +)(OA;CIIOID;RP;037088f8-0ae1-11d2-b422-00a0c968f939;4828cc14-1437-45bc-9b07-a +d6f015e5f28;RU)(OA;CIIOID;RP;037088f8-0ae1-11d2-b422-00a0c968f939;bf967aba-0d +e6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;b7c69e6d-2cc7-11d2-854e-00a0c983f6 +08;bf967a86-0de6-11d0-a285-00aa003049e2;ED)(OA;CIID;RP;b7c69e6d-2cc7-11d2-854 +e-00a0c983f608;bf967a9c-0de6-11d0-a285-00aa003049e2;ED)(OA;CIIOID;RP;b7c69e6d +-2cc7-11d2-854e-00a0c983f608;bf967aba-0de6-11d0-a285-00aa003049e2;ED)(OA;CIIO +ID;RPLCLORC;;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIID;RPLCLORC;;bf967 +a9c-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RPLCLORC;;bf967aba-0de6-11d0-a2 +85-00aa003049e2;RU)(OA;CIID;RPWPCR;91e647de-d96f-4b70-9557-d63ff4f3ccd8;;PS)( +A;CIID;RPWPCRCCDCLCLORCWOWDSDDTSW;;;S-1-5-21-3328325300-3937145445-4190589019 +-519)(A;CIID;LC;;;RU)(A;CIID;RPWPCRCCLCLORCWOWDSDSW;;;BA)S:AI(OU;CIIOIDSA;WP; +f30e3bbe-9ff0-11d1-b603-0000f80367c1;bf967aa5-0de6-11d0-a285-00aa003049e2;WD) +(OU;CIIOIDSA;WP;f30e3bbf-9ff0-11d1-b603-0000f80367c1;bf967aa5-0de6-11d0-a285- +00aa003049e2;WD)(OU;CIIOIDSA;WP;f30e3bbe-9ff0-11d1-b603-0000f80367c1;bf967aa5 +-0de6-11d0-a285-00aa003049e2;WD)(OU;CIIOIDSA;WP;f30e3bbf-9ff0-11d1-b603-0000f +80367c1;bf967aa5-0de6-11d0-a285-00aa003049e2;WD)""".split()) + +LITTLE_SD_SDDL = ''.join( +"""O:S-1-5-21-3328325300-3937145445-4190589019-512G:S-1-5-2 +1-3328325300-3937145445-4190589019-512D:AI(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;S- +1-5-21-3328325300-3937145445-4190589019-512)(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;; +SY)(A;;RPLCLORC;;;AU)(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;AO)(A;;RPLCLORC;;;PS)(O +A;;CR;ab721a55-1e2f-11d0-9819-00aa0040529b;;AU)(OA;;RP;46a9b11d-60ae-405a-b7e +8-ff8a58d456d2;;S-1-5-32-560)(OA;CIIOID;RP;4c164200-20c0-11d0-a768-00aa006e05 +29;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;4c164200-20c0-11d0-a +768-00aa006e0529;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;5f2020 +10-79a5-11d0-9020-00c04fc2d4cf;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CI +IOID;RP;5f202010-79a5-11d0-9020-00c04fc2d4cf;bf967aba-0de6-11d0-a285-00aa0030 +49e2;RU)(OA;CIIOID;RP;bc0ac240-79a9-11d0-9020-00c04fc2d4cf;4828cc14-1437-45bc +-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;bc0ac240-79a9-11d0-9020-00c04fc2d4cf;bf96 +7aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP;59ba2f42-79a2-11d0-9020-00c +04fc2d3cf;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU)(OA;CIIOID;RP;59ba2f42-79a2 +-11d0-9020-00c04fc2d3cf;bf967aba-0de6-11d0-a285-00aa003049e2;RU)(OA;CIIOID;RP +;037088f8-0ae1-11d2-b422-00a0c968f939;4828cc14-1437-45bc-9b07-ad6f015e5f28;RU +)(OA;CIIOID;RP;037088f8-0ae1-11d2-b422-00a0c968f939;bf967aba-0de6-11d0-a285-0 +0aa003049e2;RU)(OA;CIIOID;RP;b7c69e6d-2cc7-11d2-854e-00a0c983f608;bf967a86-0d +e6-11d0-a285-00aa003049e2;ED)""".split()) + +# set SCALE = 100 for normal test, or 1 for testing the test. +SCALE = 100 + +class UserTests(samba.tests.TestCase): + + def get_file_blob(self, filename): + if filename.endswith('.gz'): + f = gzip.open(filename) + else: + f = open(filename) + return f.read() + + def get_desc(self, sddl): + dummy_sid = security.dom_sid("S-2-0-0") + return security.descriptor.from_sddl(sddl, dummy_sid) + + def get_blob(self, sddl): + return ndr_pack(self.get_desc(sddl)) + + def test_00_00_do_nothing(self): + # this gives us an idea of the overhead + pass + + def _test_pack(self, unpacked, cycles=10000): + for i in range(SCALE * cycles): + ndr_pack(unpacked) + + def _test_unpack(self, blob, cycles=10000, cls=security.descriptor): + for i in range(SCALE * cycles): + ndr_unpack(cls, blob) + + def _test_pack_unpack(self, desc, cycles=5000, cls=security.descriptor): + blob2 = ndr_pack(desc) + + for i in range(SCALE * cycles): + blob = ndr_pack(desc) + desc = ndr_unpack(cls, blob) + + self.assertEqual(blob, blob2) + + def test_pack_big_sd(self): + unpacked = self.get_desc(BIG_SD_SDDL) + self._test_pack(unpacked) + + def test_unpack_big_sd(self): + blob = self.get_blob(BIG_SD_SDDL) + self._test_unpack(blob) + + def test_pack_unpack_big_sd(self): + unpacked = self.get_desc(BIG_SD_SDDL) + self._test_pack_unpack(unpacked) + + def test_pack_little_sd(self): + unpacked = self.get_desc(LITTLE_SD_SDDL) + self._test_pack(unpacked) + + def test_unpack_little_sd(self): + blob = self.get_blob(LITTLE_SD_SDDL) + self._test_unpack(blob) + + def test_pack_unpack_little_sd(self): + unpacked = self.get_desc(LITTLE_SD_SDDL) + self._test_pack_unpack(unpacked) + + def test_unpack_repl_sample(self): + blob = self.get_file_blob('testdata/replication-ndrpack-example.gz') + self._test_unpack(blob, cycles=20, cls=drsuapi.DsGetNCChangesCtr6) + + def test_pack_repl_sample(self): + blob = self.get_file_blob('testdata/replication-ndrpack-example.gz') + desc = ndr_unpack(drsuapi.DsGetNCChangesCtr6, blob) + self._test_pack(desc, cycles=20) + +if "://" not in host: + if os.path.isfile(host): + host = "tdb://%s" % host + else: + host = "ldap://%s" % host + + +if ANCIENT_SAMBA: + runner = SubunitTestRunner() + if not runner.run(unittest.makeSuite(UserTests)).wasSuccessful(): + sys.exit(1) + sys.exit(0) +else: + TestProgram(module=__name__, opts=subunitopts) diff --git a/testdata/replication-ndrpack-example.gz b/testdata/replication-ndrpack-example.gz new file mode 100644 index 0000000000000000000000000000000000000000..f3b850cb91a8ac602e2c274ac6b9a8b60c4c7abf GIT binary patch literal 132871 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 D+0i6(fl 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

3ohnfVj=$nv1AeBcGYH8 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 z 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 literal 0 HcmV?d00001 -- 2.7.4 >From 3a9abb9b7b020bfbcae3515ec49f4fff261c0be3 Mon Sep 17 00:00:00 2001 From: Douglas Bagnall Date: Fri, 24 Feb 2017 14:42:32 +1300 Subject: [PATCH 2/4] selftest: add search performance tests Signed-off-by: Douglas Bagnall --- selftest/perf_tests.py | 9 + .../dsdb/tests/python/ad_dc_search_performance.py | 293 +++++++++++++++++++++ 2 files changed, 302 insertions(+) create mode 100644 source4/dsdb/tests/python/ad_dc_search_performance.py diff --git a/selftest/perf_tests.py b/selftest/perf_tests.py index 113170c..adc4ef9 100644 --- a/selftest/perf_tests.py +++ b/selftest/perf_tests.py @@ -33,6 +33,15 @@ plantestsuite_loadlist("samba4.ndr_pack_performance.python(ad_dc_ntvfs)", '--workgroup=$DOMAIN', '$LOADLIST', '$LISTOPT']) +plantestsuite_loadlist("samba4.ldap.ad_dc_search_performance.python(ad_dc_ntvfs)", + "ad_dc_ntvfs", + [python, + os.path.join(samba4srcdir, + "dsdb/tests/python/ad_dc_search_performance.py"), + '$SERVER', '-U"$USERNAME%$PASSWORD"', + '--workgroup=$DOMAIN', + '$LOADLIST', '$LISTOPT']) + plantestsuite_loadlist("samba4.ldap.ad_dc_multi_bind.ntlm.python(ad_dc_ntvfs)", "ad_dc_ntvfs", [python, os.path.join(samba4srcdir, diff --git a/source4/dsdb/tests/python/ad_dc_search_performance.py b/source4/dsdb/tests/python/ad_dc_search_performance.py new file mode 100644 index 0000000..ec4a02f --- /dev/null +++ b/source4/dsdb/tests/python/ad_dc_search_performance.py @@ -0,0 +1,293 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +import optparse +import sys +sys.path.insert(0, 'bin/python') + +import os +import samba +import samba.getopt as options +import random +import tempfile +import shutil +import time +import itertools + +from samba.netcmd.main import cmd_sambatool + +# We try to use the test infrastructure of Samba 4.3+, but if it +# doesn't work, we are probably in a back-ported patch and trying to +# run on 4.1 or something. +# +# Don't copy this horror into ordinary tests -- it is special for +# performance tests that want to apply to old versions. +try: + from samba.tests.subunitrun import SubunitOptions, TestProgram + ANCIENT_SAMBA = False +except ImportError: + ANCIENT_SAMBA = True + samba.ensure_external_module("testtools", "testtools") + samba.ensure_external_module("subunit", "subunit/python") + from subunit.run import SubunitTestRunner + import unittest + +from samba.samdb import SamDB +from samba.auth import system_session +from ldb import Message, MessageElement, Dn, LdbError +from ldb import FLAG_MOD_ADD, FLAG_MOD_REPLACE, FLAG_MOD_DELETE +from ldb import SCOPE_BASE, SCOPE_SUBTREE, SCOPE_ONELEVEL + +parser = optparse.OptionParser("ad_dc_performance.py [options] ") +sambaopts = options.SambaOptions(parser) +parser.add_option_group(sambaopts) +parser.add_option_group(options.VersionOptions(parser)) + +if not ANCIENT_SAMBA: + subunitopts = SubunitOptions(parser) + parser.add_option_group(subunitopts) + +# use command line creds if available +credopts = options.CredentialsOptions(parser) +parser.add_option_group(credopts) +opts, args = parser.parse_args() + + +if len(args) < 1: + parser.print_usage() + sys.exit(1) + +host = args[0] + +lp = sambaopts.get_loadparm() +creds = credopts.get_credentials(lp) + +random.seed(1) + + +class PerfTestException(Exception): + pass + + +BATCH_SIZE = 1000 +N_GROUPS = 5 + + +class GlobalState(object): + next_user_id = 0 + n_groups = 0 + next_linked_user = 0 + next_relinked_user = 0 + next_linked_user_3 = 0 + next_removed_link_0 = 0 + + +class UserTests(samba.tests.TestCase): + + def add_if_possible(self, *args, **kwargs): + """In these tests sometimes things are left in the database + deliberately, so we don't worry if we fail to add them a second + time.""" + try: + self.ldb.add(*args, **kwargs) + except LdbError: + pass + + def setUp(self): + super(UserTests, self).setUp() + self.state = GlobalState # the class itself, not an instance + self.lp = lp + self.ldb = SamDB(host, credentials=creds, + session_info=system_session(lp), lp=lp) + 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 + self.ou_groups = "OU=groups,%s" % self.ou + self.ou_computers = "OU=computers,%s" % self.ou + + for dn in (self.ou, self.ou_users, self.ou_groups, + self.ou_computers): + self.add_if_possible({ + "dn": dn, + "objectclass": "organizationalUnit"}) + + def tearDown(self): + super(UserTests, self).tearDown() + + def test_00_00_do_nothing(self): + # this gives us an idea of the overhead + pass + + def _prepare_n_groups(self, n): + self.state.n_groups = n + for i in range(n): + self.add_if_possible({ + "dn": "cn=g%d,%s" % (i, self.ou_groups), + "objectclass": "group"}) + + def _add_users(self, start, end): + for i in range(start, end): + self.ldb.add({ + "dn": "cn=u%d,%s" % (i, self.ou_users), + "objectclass": "user"}) + + def _add_users_ldif(self, start, end): + lines = [] + for i in range(start, end): + lines.append("dn: cn=u%d,%s" % (i, self.ou_users)) + lines.append("objectclass: user") + lines.append("") + self.ldb.add_ldif('\n'.join(lines)) + + def _test_unindexed_search(self): + expressions = [ + ('(&(objectclass=user)(description=' + 'Built-in account for adminstering the computer/domain))'), + '(description=Built-in account for adminstering the computer/domain)', + '(objectCategory=*)', + '(samaccountname=Administrator*)' + ] + for expression in expressions: + t = time.time() + for i in range(50): + self.ldb.search(self.ou, + expression=expression, + scope=SCOPE_SUBTREE, + attrs=['cn']) + print >> sys.stderr, '%d %s took %s' % (i, expression, + time.time() - t) + + def _test_indexed_search(self): + expressions = ['(objectclass=group)', + '(samaccountname=Administrator)' + ] + for expression in expressions: + t = time.time() + for i in range(10000): + self.ldb.search(self.ou, + expression=expression, + scope=SCOPE_SUBTREE, + attrs=['cn']) + print >> sys.stderr, '%d runs %s took %s' % (i, expression, + time.time() - t) + + def _test_complex_search(self): + classes = ['samaccountname', 'objectCategory', 'dn', 'member'] + values = ['*', '*t*', 'g*', 'user'] + comparators = ['=', '<=', '>='] # '~=' causes error + maybe_not = ['!(', ''] + joiners = ['&', '|'] + + # The number of permuations is 18432, which is not huge but + # would take hours to search. So we take a sample. + all_permutations = list(itertools.product(joiners, + classes, classes, + values, values, + comparators, comparators, + maybe_not, maybe_not)) + random.seed(1) + + + + for (j, c1, c2, v1, v2, + o1, o2, n1, n2) in random.sample(all_permutations, 100): + expression = ''.join(['(', j, + '(', n1, c1, o1, v1, + '))' if n1 else ')', + '(', n2, c2, o2, v2, + '))' if n2 else ')', + ')']) + print expression + self.ldb.search(self.ou, + expression=expression, + scope=SCOPE_SUBTREE, + attrs=['cn']) + + def _test_member_search(self): + expressions = [] + for d in range(50): + expressions.append('(member=cn=u%d,%s)' % (d + 500, self.ou_users)) + expressions.append('(member=u%d*)' % (d + 700,)) + for i in range(N_GROUPS): + expressions.append('(memberOf=cn=g%d,%s)' % (i, self.ou_groups)) + expressions.append('(memberOf=cn=g%d*)' % (i,)) + expressions.append('(memberOf=cn=*%s*)' % self.ou_groups) + + for expression in expressions: + t = time.time() + for i in range(10): + self.ldb.search(self.ou, + expression=expression, + scope=SCOPE_SUBTREE, + attrs=['cn']) + print >> sys.stderr, '%d runs %s took %s' % (i, expression, + time.time() - t) + + def _test_add_many_users(self, n=BATCH_SIZE): + s = self.state.next_user_id + e = s + n + self._add_users(s, e) + self.state.next_user_id = e + + def _test_add_many_users_ldif(self, n=BATCH_SIZE): + s = self.state.next_user_id + e = s + n + self._add_users_ldif(s, e) + self.state.next_user_id = e + + def _link_user_and_group(self, u, g): + m = Message() + m.dn = Dn(self.ldb, "CN=g%d,%s" % (g, self.ou_groups)) + m["member"] = MessageElement("cn=u%d,%s" % (u, self.ou_users), + FLAG_MOD_ADD, "member") + self.ldb.modify(m) + + def _test_link_many_users(self, n=BATCH_SIZE): + self._prepare_n_groups(N_GROUPS) + s = self.state.next_linked_user + e = s + n + for i in range(s, e): + # put everyone in group 0, and one other group + g = i % (N_GROUPS - 1) + 1 + self._link_user_and_group(i, g) + self._link_user_and_group(i, 0) + self.state.next_linked_user = e + + + test_00_01_adding_users_1000 = _test_add_many_users + + test_00_10_complex_search_1k_users = _test_complex_search + test_00_11_unindexed_search_1k_users = _test_unindexed_search + test_00_12_indexed_search_1k_users = _test_indexed_search + test_00_13_member_search_1k_users = _test_member_search + + test_01_02_adding_users_2000_ldif = _test_add_many_users_ldif + test_01_03_adding_users_3000 = _test_add_many_users + + test_01_10_complex_search_3k_users = _test_complex_search + test_01_11_unindexed_search_3k_users = _test_unindexed_search + test_01_12_indexed_search_3k_users = _test_indexed_search + test_01_13_member_search_3k_users = _test_member_search + + test_02_01_link_users_1000 = _test_link_many_users + test_02_02_link_users_2000 = _test_link_many_users + test_02_03_link_users_3000 = _test_link_many_users + + test_03_10_complex_search_linked_users = _test_complex_search + test_03_11_unindexed_search_linked_users = _test_unindexed_search + test_03_12_indexed_search_linked_users = _test_indexed_search + test_03_12_member_search_linked_users = _test_member_search + +if "://" not in host: + if os.path.isfile(host): + host = "tdb://%s" % host + else: + host = "ldap://%s" % host + + +if ANCIENT_SAMBA: + runner = SubunitTestRunner() + if not runner.run(unittest.makeSuite(UserTests)).wasSuccessful(): + sys.exit(1) + sys.exit(0) +else: + TestProgram(module=__name__, opts=subunitopts) -- 2.7.4 >From 481974e052cf69e708bedea71cb99bfdc3a8fb0f Mon Sep 17 00:00:00 2001 From: Douglas Bagnall Date: Fri, 24 Feb 2017 11:58:33 +1300 Subject: [PATCH 3/4] ndr: Use resizing array instead of linked lists (breaking ABI) The ndr token code keeps a temporary store of tokens which are referred to a small number of times (often once) before being discarded. The access patterns are somewhat stack-like, with recently placed tokens being accessed most often. The old code kept these tokens in a linked list, which we replace with a self-resizing array. This keeps everything roughly the same in big-O terms, but makes it all faster in practice by vastly reducing the amount of tallocing and pointer-chasing. The peak memory use is strictly reduced. On a 64 bit machine each core token struct fits in 16 bytes (after padding) while the two pointers used by the DLIST add another 16 bytes, so the overall list allocation is the same as the peak 2n array allocation -- except in the list case it is dwarfed by the talloc and malloc metadata overhead. Before settling on the resized arrays, we tried red-black trees, which are bound to be better for large ndr structures. As it happens, we don't deal with large structures (the size of replication clumps is limited to 400 objects) and the asymptotic benefits of the trees are not realised in practice. With luck you should find graphs comparing the performance of these various techniques at: https://www.samba.org/~dbagnall/perf-tests/ndr-token/ This necessarily breaks the ABI because the linked list implementation was publicly exposed. Signed-off-by: Douglas Bagnall --- librpc/ABI/ndr-0.1.0.sigs | 259 ++++++++++++++++++++++++++++++++++++++++++++++ librpc/ndr/libndr.h | 53 ++++++---- librpc/ndr/ndr.c | 82 ++++++++++----- librpc/wscript_build | 2 +- 4 files changed, 347 insertions(+), 49 deletions(-) create mode 100644 librpc/ABI/ndr-0.1.0.sigs diff --git a/librpc/ABI/ndr-0.1.0.sigs b/librpc/ABI/ndr-0.1.0.sigs new file mode 100644 index 0000000..80a3faf --- /dev/null +++ b/librpc/ABI/ndr-0.1.0.sigs @@ -0,0 +1,259 @@ +GUID_all_zero: bool (const struct GUID *) +GUID_buf_string: char *(const struct GUID *, struct GUID_txt_buf *) +GUID_compare: int (const struct GUID *, const struct GUID *) +GUID_equal: bool (const struct GUID *, const struct GUID *) +GUID_from_data_blob: NTSTATUS (const DATA_BLOB *, struct GUID *) +GUID_from_ndr_blob: NTSTATUS (const DATA_BLOB *, struct GUID *) +GUID_from_string: NTSTATUS (const char *, struct GUID *) +GUID_hexstring: char *(TALLOC_CTX *, const struct GUID *) +GUID_random: struct GUID (void) +GUID_string: char *(TALLOC_CTX *, const struct GUID *) +GUID_string2: char *(TALLOC_CTX *, const struct GUID *) +GUID_to_ndr_blob: NTSTATUS (const struct GUID *, TALLOC_CTX *, DATA_BLOB *) +GUID_zero: struct GUID (void) +ndr_align_size: size_t (uint32_t, size_t) +ndr_charset_length: uint32_t (const void *, charset_t) +ndr_check_array_length: enum ndr_err_code (struct ndr_pull *, void *, uint32_t) +ndr_check_array_size: enum ndr_err_code (struct ndr_pull *, void *, uint32_t) +ndr_check_padding: void (struct ndr_pull *, size_t) +ndr_check_pipe_chunk_trailer: enum ndr_err_code (struct ndr_pull *, int, uint32_t) +ndr_check_string_terminator: enum ndr_err_code (struct ndr_pull *, uint32_t, uint32_t) +ndr_get_array_length: uint32_t (struct ndr_pull *, const void *) +ndr_get_array_size: uint32_t (struct ndr_pull *, const void *) +ndr_map_error2errno: int (enum ndr_err_code) +ndr_map_error2ntstatus: NTSTATUS (enum ndr_err_code) +ndr_map_error2string: const char *(enum ndr_err_code) +ndr_policy_handle_empty: bool (const struct policy_handle *) +ndr_policy_handle_equal: bool (const struct policy_handle *, const struct policy_handle *) +ndr_print_DATA_BLOB: void (struct ndr_print *, const char *, DATA_BLOB) +ndr_print_GUID: void (struct ndr_print *, const char *, const struct GUID *) +ndr_print_HRESULT: void (struct ndr_print *, const char *, HRESULT) +ndr_print_KRB5_EDATA_NTSTATUS: void (struct ndr_print *, const char *, const struct KRB5_EDATA_NTSTATUS *) +ndr_print_NTSTATUS: void (struct ndr_print *, const char *, NTSTATUS) +ndr_print_NTTIME: void (struct ndr_print *, const char *, NTTIME) +ndr_print_NTTIME_1sec: void (struct ndr_print *, const char *, NTTIME) +ndr_print_NTTIME_hyper: void (struct ndr_print *, const char *, NTTIME) +ndr_print_WERROR: void (struct ndr_print *, const char *, WERROR) +ndr_print_array_uint8: void (struct ndr_print *, const char *, const uint8_t *, uint32_t) +ndr_print_bad_level: void (struct ndr_print *, const char *, uint16_t) +ndr_print_bitmap_flag: void (struct ndr_print *, size_t, const char *, uint32_t, uint32_t) +ndr_print_bool: void (struct ndr_print *, const char *, const bool) +ndr_print_debug: void (ndr_print_fn_t, const char *, void *) +ndr_print_debug_helper: void (struct ndr_print *, const char *, ...) +ndr_print_debugc: void (int, ndr_print_fn_t, const char *, void *) +ndr_print_debugc_helper: void (struct ndr_print *, const char *, ...) +ndr_print_dlong: void (struct ndr_print *, const char *, int64_t) +ndr_print_double: void (struct ndr_print *, const char *, double) +ndr_print_enum: void (struct ndr_print *, const char *, const char *, const char *, uint32_t) +ndr_print_function_debug: void (ndr_print_function_t, const char *, int, void *) +ndr_print_function_string: char *(TALLOC_CTX *, ndr_print_function_t, const char *, int, void *) +ndr_print_get_switch_value: uint32_t (struct ndr_print *, const void *) +ndr_print_gid_t: void (struct ndr_print *, const char *, gid_t) +ndr_print_hyper: void (struct ndr_print *, const char *, uint64_t) +ndr_print_int16: void (struct ndr_print *, const char *, int16_t) +ndr_print_int32: void (struct ndr_print *, const char *, int32_t) +ndr_print_int3264: void (struct ndr_print *, const char *, int32_t) +ndr_print_int8: void (struct ndr_print *, const char *, int8_t) +ndr_print_ipv4address: void (struct ndr_print *, const char *, const char *) +ndr_print_ipv6address: void (struct ndr_print *, const char *, const char *) +ndr_print_ndr_syntax_id: void (struct ndr_print *, const char *, const struct ndr_syntax_id *) +ndr_print_netr_SamDatabaseID: void (struct ndr_print *, const char *, enum netr_SamDatabaseID) +ndr_print_netr_SchannelType: void (struct ndr_print *, const char *, enum netr_SchannelType) +ndr_print_null: void (struct ndr_print *) +ndr_print_pointer: void (struct ndr_print *, const char *, void *) +ndr_print_policy_handle: void (struct ndr_print *, const char *, const struct policy_handle *) +ndr_print_printf_helper: void (struct ndr_print *, const char *, ...) +ndr_print_ptr: void (struct ndr_print *, const char *, const void *) +ndr_print_set_switch_value: enum ndr_err_code (struct ndr_print *, const void *, uint32_t) +ndr_print_sockaddr_storage: void (struct ndr_print *, const char *, const struct sockaddr_storage *) +ndr_print_string: void (struct ndr_print *, const char *, const char *) +ndr_print_string_array: void (struct ndr_print *, const char *, const char **) +ndr_print_string_helper: void (struct ndr_print *, const char *, ...) +ndr_print_struct: void (struct ndr_print *, const char *, const char *) +ndr_print_struct_string: char *(TALLOC_CTX *, ndr_print_fn_t, const char *, void *) +ndr_print_svcctl_ServerType: void (struct ndr_print *, const char *, uint32_t) +ndr_print_time_t: void (struct ndr_print *, const char *, time_t) +ndr_print_timespec: void (struct ndr_print *, const char *, const struct timespec *) +ndr_print_timeval: void (struct ndr_print *, const char *, const struct timeval *) +ndr_print_udlong: void (struct ndr_print *, const char *, uint64_t) +ndr_print_udlongr: void (struct ndr_print *, const char *, uint64_t) +ndr_print_uid_t: void (struct ndr_print *, const char *, uid_t) +ndr_print_uint16: void (struct ndr_print *, const char *, uint16_t) +ndr_print_uint32: void (struct ndr_print *, const char *, uint32_t) +ndr_print_uint3264: void (struct ndr_print *, const char *, uint32_t) +ndr_print_uint8: void (struct ndr_print *, const char *, uint8_t) +ndr_print_union: void (struct ndr_print *, const char *, int, const char *) +ndr_print_union_debug: void (ndr_print_fn_t, const char *, uint32_t, void *) +ndr_print_union_string: char *(TALLOC_CTX *, ndr_print_fn_t, const char *, uint32_t, void *) +ndr_print_winreg_Data: void (struct ndr_print *, const char *, const union winreg_Data *) +ndr_print_winreg_Type: void (struct ndr_print *, const char *, enum winreg_Type) +ndr_pull_DATA_BLOB: enum ndr_err_code (struct ndr_pull *, int, DATA_BLOB *) +ndr_pull_GUID: enum ndr_err_code (struct ndr_pull *, int, struct GUID *) +ndr_pull_HRESULT: enum ndr_err_code (struct ndr_pull *, int, HRESULT *) +ndr_pull_KRB5_EDATA_NTSTATUS: enum ndr_err_code (struct ndr_pull *, int, struct KRB5_EDATA_NTSTATUS *) +ndr_pull_NTSTATUS: enum ndr_err_code (struct ndr_pull *, int, NTSTATUS *) +ndr_pull_NTTIME: enum ndr_err_code (struct ndr_pull *, int, NTTIME *) +ndr_pull_NTTIME_1sec: enum ndr_err_code (struct ndr_pull *, int, NTTIME *) +ndr_pull_NTTIME_hyper: enum ndr_err_code (struct ndr_pull *, int, NTTIME *) +ndr_pull_WERROR: enum ndr_err_code (struct ndr_pull *, int, WERROR *) +ndr_pull_advance: enum ndr_err_code (struct ndr_pull *, uint32_t) +ndr_pull_align: enum ndr_err_code (struct ndr_pull *, size_t) +ndr_pull_append: enum ndr_err_code (struct ndr_pull *, DATA_BLOB *) +ndr_pull_array_length: enum ndr_err_code (struct ndr_pull *, const void *) +ndr_pull_array_size: enum ndr_err_code (struct ndr_pull *, const void *) +ndr_pull_array_uint8: enum ndr_err_code (struct ndr_pull *, int, uint8_t *, uint32_t) +ndr_pull_bytes: enum ndr_err_code (struct ndr_pull *, uint8_t *, uint32_t) +ndr_pull_charset: enum ndr_err_code (struct ndr_pull *, int, const char **, uint32_t, uint8_t, charset_t) +ndr_pull_charset_to_null: enum ndr_err_code (struct ndr_pull *, int, const char **, uint32_t, uint8_t, charset_t) +ndr_pull_dlong: enum ndr_err_code (struct ndr_pull *, int, int64_t *) +ndr_pull_double: enum ndr_err_code (struct ndr_pull *, int, double *) +ndr_pull_enum_uint16: enum ndr_err_code (struct ndr_pull *, int, uint16_t *) +ndr_pull_enum_uint1632: enum ndr_err_code (struct ndr_pull *, int, uint16_t *) +ndr_pull_enum_uint32: enum ndr_err_code (struct ndr_pull *, int, uint32_t *) +ndr_pull_enum_uint8: enum ndr_err_code (struct ndr_pull *, int, uint8_t *) +ndr_pull_error: enum ndr_err_code (struct ndr_pull *, enum ndr_err_code, const char *, ...) +ndr_pull_generic_ptr: enum ndr_err_code (struct ndr_pull *, uint32_t *) +ndr_pull_get_relative_base_offset: uint32_t (struct ndr_pull *) +ndr_pull_get_switch_value: uint32_t (struct ndr_pull *, const void *) +ndr_pull_gid_t: enum ndr_err_code (struct ndr_pull *, int, gid_t *) +ndr_pull_hyper: enum ndr_err_code (struct ndr_pull *, int, uint64_t *) +ndr_pull_init_blob: struct ndr_pull *(const DATA_BLOB *, TALLOC_CTX *) +ndr_pull_int16: enum ndr_err_code (struct ndr_pull *, int, int16_t *) +ndr_pull_int32: enum ndr_err_code (struct ndr_pull *, int, int32_t *) +ndr_pull_int8: enum ndr_err_code (struct ndr_pull *, int, int8_t *) +ndr_pull_ipv4address: enum ndr_err_code (struct ndr_pull *, int, const char **) +ndr_pull_ipv6address: enum ndr_err_code (struct ndr_pull *, int, const char **) +ndr_pull_ndr_syntax_id: enum ndr_err_code (struct ndr_pull *, int, struct ndr_syntax_id *) +ndr_pull_netr_SamDatabaseID: enum ndr_err_code (struct ndr_pull *, int, enum netr_SamDatabaseID *) +ndr_pull_netr_SchannelType: enum ndr_err_code (struct ndr_pull *, int, enum netr_SchannelType *) +ndr_pull_pointer: enum ndr_err_code (struct ndr_pull *, int, void **) +ndr_pull_policy_handle: enum ndr_err_code (struct ndr_pull *, int, struct policy_handle *) +ndr_pull_pop: enum ndr_err_code (struct ndr_pull *) +ndr_pull_ref_ptr: enum ndr_err_code (struct ndr_pull *, uint32_t *) +ndr_pull_relative_ptr1: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t) +ndr_pull_relative_ptr2: enum ndr_err_code (struct ndr_pull *, const void *) +ndr_pull_relative_ptr_short: enum ndr_err_code (struct ndr_pull *, uint16_t *) +ndr_pull_restore_relative_base_offset: void (struct ndr_pull *, uint32_t) +ndr_pull_set_switch_value: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t) +ndr_pull_setup_relative_base_offset1: enum ndr_err_code (struct ndr_pull *, const void *, uint32_t) +ndr_pull_setup_relative_base_offset2: enum ndr_err_code (struct ndr_pull *, const void *) +ndr_pull_steal_switch_value: uint32_t (struct ndr_pull *, const void *) +ndr_pull_string: enum ndr_err_code (struct ndr_pull *, int, const char **) +ndr_pull_string_array: enum ndr_err_code (struct ndr_pull *, int, const char ***) +ndr_pull_struct_blob: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, ndr_pull_flags_fn_t) +ndr_pull_struct_blob_all: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, ndr_pull_flags_fn_t) +ndr_pull_struct_blob_all_noalloc: enum ndr_err_code (const DATA_BLOB *, void *, ndr_pull_flags_fn_t) +ndr_pull_subcontext_end: enum ndr_err_code (struct ndr_pull *, struct ndr_pull *, size_t, ssize_t) +ndr_pull_subcontext_start: enum ndr_err_code (struct ndr_pull *, struct ndr_pull **, size_t, ssize_t) +ndr_pull_svcctl_ServerType: enum ndr_err_code (struct ndr_pull *, int, uint32_t *) +ndr_pull_time_t: enum ndr_err_code (struct ndr_pull *, int, time_t *) +ndr_pull_timespec: enum ndr_err_code (struct ndr_pull *, int, struct timespec *) +ndr_pull_timeval: enum ndr_err_code (struct ndr_pull *, int, struct timeval *) +ndr_pull_trailer_align: enum ndr_err_code (struct ndr_pull *, size_t) +ndr_pull_udlong: enum ndr_err_code (struct ndr_pull *, int, uint64_t *) +ndr_pull_udlongr: enum ndr_err_code (struct ndr_pull *, int, uint64_t *) +ndr_pull_uid_t: enum ndr_err_code (struct ndr_pull *, int, uid_t *) +ndr_pull_uint16: enum ndr_err_code (struct ndr_pull *, int, uint16_t *) +ndr_pull_uint1632: enum ndr_err_code (struct ndr_pull *, int, uint16_t *) +ndr_pull_uint32: enum ndr_err_code (struct ndr_pull *, int, uint32_t *) +ndr_pull_uint3264: enum ndr_err_code (struct ndr_pull *, int, uint32_t *) +ndr_pull_uint8: enum ndr_err_code (struct ndr_pull *, int, uint8_t *) +ndr_pull_union_align: enum ndr_err_code (struct ndr_pull *, size_t) +ndr_pull_union_blob: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, uint32_t, ndr_pull_flags_fn_t) +ndr_pull_union_blob_all: enum ndr_err_code (const DATA_BLOB *, TALLOC_CTX *, void *, uint32_t, ndr_pull_flags_fn_t) +ndr_pull_winreg_Data: enum ndr_err_code (struct ndr_pull *, int, union winreg_Data *) +ndr_pull_winreg_Type: enum ndr_err_code (struct ndr_pull *, int, enum winreg_Type *) +ndr_push_DATA_BLOB: enum ndr_err_code (struct ndr_push *, int, DATA_BLOB) +ndr_push_GUID: enum ndr_err_code (struct ndr_push *, int, const struct GUID *) +ndr_push_HRESULT: enum ndr_err_code (struct ndr_push *, int, HRESULT) +ndr_push_KRB5_EDATA_NTSTATUS: enum ndr_err_code (struct ndr_push *, int, const struct KRB5_EDATA_NTSTATUS *) +ndr_push_NTSTATUS: enum ndr_err_code (struct ndr_push *, int, NTSTATUS) +ndr_push_NTTIME: enum ndr_err_code (struct ndr_push *, int, NTTIME) +ndr_push_NTTIME_1sec: enum ndr_err_code (struct ndr_push *, int, NTTIME) +ndr_push_NTTIME_hyper: enum ndr_err_code (struct ndr_push *, int, NTTIME) +ndr_push_WERROR: enum ndr_err_code (struct ndr_push *, int, WERROR) +ndr_push_align: enum ndr_err_code (struct ndr_push *, size_t) +ndr_push_array_uint8: enum ndr_err_code (struct ndr_push *, int, const uint8_t *, uint32_t) +ndr_push_blob: DATA_BLOB (struct ndr_push *) +ndr_push_bytes: enum ndr_err_code (struct ndr_push *, const uint8_t *, uint32_t) +ndr_push_charset: enum ndr_err_code (struct ndr_push *, int, const char *, uint32_t, uint8_t, charset_t) +ndr_push_charset_to_null: enum ndr_err_code (struct ndr_push *, int, const char *, uint32_t, uint8_t, charset_t) +ndr_push_dlong: enum ndr_err_code (struct ndr_push *, int, int64_t) +ndr_push_double: enum ndr_err_code (struct ndr_push *, int, double) +ndr_push_enum_uint16: enum ndr_err_code (struct ndr_push *, int, uint16_t) +ndr_push_enum_uint1632: enum ndr_err_code (struct ndr_push *, int, uint16_t) +ndr_push_enum_uint32: enum ndr_err_code (struct ndr_push *, int, uint32_t) +ndr_push_enum_uint8: enum ndr_err_code (struct ndr_push *, int, uint8_t) +ndr_push_error: enum ndr_err_code (struct ndr_push *, enum ndr_err_code, const char *, ...) +ndr_push_expand: enum ndr_err_code (struct ndr_push *, uint32_t) +ndr_push_full_ptr: enum ndr_err_code (struct ndr_push *, const void *) +ndr_push_get_relative_base_offset: uint32_t (struct ndr_push *) +ndr_push_get_switch_value: uint32_t (struct ndr_push *, const void *) +ndr_push_gid_t: enum ndr_err_code (struct ndr_push *, int, gid_t) +ndr_push_hyper: enum ndr_err_code (struct ndr_push *, int, uint64_t) +ndr_push_init_ctx: struct ndr_push *(TALLOC_CTX *) +ndr_push_int16: enum ndr_err_code (struct ndr_push *, int, int16_t) +ndr_push_int32: enum ndr_err_code (struct ndr_push *, int, int32_t) +ndr_push_int8: enum ndr_err_code (struct ndr_push *, int, int8_t) +ndr_push_ipv4address: enum ndr_err_code (struct ndr_push *, int, const char *) +ndr_push_ipv6address: enum ndr_err_code (struct ndr_push *, int, const char *) +ndr_push_ndr_syntax_id: enum ndr_err_code (struct ndr_push *, int, const struct ndr_syntax_id *) +ndr_push_netr_SamDatabaseID: enum ndr_err_code (struct ndr_push *, int, enum netr_SamDatabaseID) +ndr_push_netr_SchannelType: enum ndr_err_code (struct ndr_push *, int, enum netr_SchannelType) +ndr_push_pipe_chunk_trailer: enum ndr_err_code (struct ndr_push *, int, uint32_t) +ndr_push_pointer: enum ndr_err_code (struct ndr_push *, int, void *) +ndr_push_policy_handle: enum ndr_err_code (struct ndr_push *, int, const struct policy_handle *) +ndr_push_ref_ptr: enum ndr_err_code (struct ndr_push *) +ndr_push_relative_ptr1: enum ndr_err_code (struct ndr_push *, const void *) +ndr_push_relative_ptr2_end: enum ndr_err_code (struct ndr_push *, const void *) +ndr_push_relative_ptr2_start: enum ndr_err_code (struct ndr_push *, const void *) +ndr_push_restore_relative_base_offset: void (struct ndr_push *, uint32_t) +ndr_push_set_switch_value: enum ndr_err_code (struct ndr_push *, const void *, uint32_t) +ndr_push_setup_relative_base_offset1: enum ndr_err_code (struct ndr_push *, const void *, uint32_t) +ndr_push_setup_relative_base_offset2: enum ndr_err_code (struct ndr_push *, const void *) +ndr_push_short_relative_ptr1: enum ndr_err_code (struct ndr_push *, const void *) +ndr_push_short_relative_ptr2: enum ndr_err_code (struct ndr_push *, const void *) +ndr_push_string: enum ndr_err_code (struct ndr_push *, int, const char *) +ndr_push_string_array: enum ndr_err_code (struct ndr_push *, int, const char **) +ndr_push_struct_blob: enum ndr_err_code (DATA_BLOB *, TALLOC_CTX *, const void *, ndr_push_flags_fn_t) +ndr_push_struct_into_fixed_blob: enum ndr_err_code (DATA_BLOB *, const void *, ndr_push_flags_fn_t) +ndr_push_subcontext_end: enum ndr_err_code (struct ndr_push *, struct ndr_push *, size_t, ssize_t) +ndr_push_subcontext_start: enum ndr_err_code (struct ndr_push *, struct ndr_push **, size_t, ssize_t) +ndr_push_svcctl_ServerType: enum ndr_err_code (struct ndr_push *, int, uint32_t) +ndr_push_time_t: enum ndr_err_code (struct ndr_push *, int, time_t) +ndr_push_timespec: enum ndr_err_code (struct ndr_push *, int, const struct timespec *) +ndr_push_timeval: enum ndr_err_code (struct ndr_push *, int, const struct timeval *) +ndr_push_trailer_align: enum ndr_err_code (struct ndr_push *, size_t) +ndr_push_udlong: enum ndr_err_code (struct ndr_push *, int, uint64_t) +ndr_push_udlongr: enum ndr_err_code (struct ndr_push *, int, uint64_t) +ndr_push_uid_t: enum ndr_err_code (struct ndr_push *, int, uid_t) +ndr_push_uint16: enum ndr_err_code (struct ndr_push *, int, uint16_t) +ndr_push_uint1632: enum ndr_err_code (struct ndr_push *, int, uint16_t) +ndr_push_uint32: enum ndr_err_code (struct ndr_push *, int, uint32_t) +ndr_push_uint3264: enum ndr_err_code (struct ndr_push *, int, uint32_t) +ndr_push_uint8: enum ndr_err_code (struct ndr_push *, int, uint8_t) +ndr_push_union_align: enum ndr_err_code (struct ndr_push *, size_t) +ndr_push_union_blob: enum ndr_err_code (DATA_BLOB *, TALLOC_CTX *, void *, uint32_t, ndr_push_flags_fn_t) +ndr_push_unique_ptr: enum ndr_err_code (struct ndr_push *, const void *) +ndr_push_winreg_Data: enum ndr_err_code (struct ndr_push *, int, const union winreg_Data *) +ndr_push_winreg_Type: enum ndr_err_code (struct ndr_push *, int, enum winreg_Type) +ndr_push_zero: enum ndr_err_code (struct ndr_push *, uint32_t) +ndr_set_flags: void (uint32_t *, uint32_t) +ndr_size_DATA_BLOB: uint32_t (int, const DATA_BLOB *, int) +ndr_size_GUID: size_t (const struct GUID *, int) +ndr_size_string: uint32_t (int, const char * const *, int) +ndr_size_string_array: size_t (const char **, uint32_t, int) +ndr_size_struct: size_t (const void *, int, ndr_push_flags_fn_t) +ndr_size_union: size_t (const void *, int, uint32_t, ndr_push_flags_fn_t) +ndr_string_array_size: size_t (struct ndr_push *, const char *) +ndr_string_length: uint32_t (const void *, uint32_t) +ndr_syntax_id_equal: bool (const struct ndr_syntax_id *, const struct ndr_syntax_id *) +ndr_syntax_id_from_string: bool (const char *, struct ndr_syntax_id *) +ndr_syntax_id_null: uuid = {time_low = 0, time_mid = 0, time_hi_and_version = 0, clock_seq = "\000", node = "\000\000\000\000\000"}, if_version = 0 +ndr_syntax_id_to_string: char *(TALLOC_CTX *, const struct ndr_syntax_id *) +ndr_token_peek: uint32_t (struct ndr_token_list *, const void *) +ndr_token_retrieve: enum ndr_err_code (struct ndr_token_list *, const void *, uint32_t *) +ndr_token_retrieve_cmp_fn: enum ndr_err_code (struct ndr_token_list *, const void *, uint32_t *, comparison_fn_t, bool) +ndr_token_store: enum ndr_err_code (TALLOC_CTX *, struct ndr_token_list *, const void *, uint32_t) +ndr_transfer_syntax_ndr: uuid = {time_low = 2324192516, time_mid = 7403, time_hi_and_version = 4553, clock_seq = "\237\350", node = "\b\000+\020H`"}, if_version = 2 +ndr_transfer_syntax_ndr64: uuid = {time_low = 1903232307, time_mid = 48826, time_hi_and_version = 18743, clock_seq = "\203\031", node = "\265\333\357\234\314\066"}, if_version = 1 diff --git a/librpc/ndr/libndr.h b/librpc/ndr/libndr.h index 7337e86..8292ff0 100644 --- a/librpc/ndr/libndr.h +++ b/librpc/ndr/libndr.h @@ -40,14 +40,20 @@ /* this is used by the token store/retrieve code */ -struct ndr_token_list { - struct ndr_token_list *next, *prev; +struct ndr_token { const void *key; uint32_t value; }; -/* this is the base structure passed to routines that - parse MSRPC formatted data + +struct ndr_token_list { + struct ndr_token *tokens; + uint32_t count; + uint32_t alloc_count; +}; + +/* this is the base structure passed to routines that + parse MSRPC formatted data note that in Samba4 we use separate routines and structures for MSRPC marshalling and unmarshalling. Also note that these routines @@ -63,12 +69,12 @@ struct ndr_pull { uint32_t relative_highest_offset; uint32_t relative_base_offset; uint32_t relative_rap_convert; - struct ndr_token_list *relative_base_list; + struct ndr_token_list relative_base_list; - struct ndr_token_list *relative_list; - struct ndr_token_list *array_size_list; - struct ndr_token_list *array_length_list; - struct ndr_token_list *switch_list; + struct ndr_token_list relative_list; + struct ndr_token_list array_size_list; + struct ndr_token_list array_length_list; + struct ndr_token_list switch_list; TALLOC_CTX *current_mem_ctx; @@ -84,17 +90,17 @@ struct ndr_push { uint32_t alloc_size; uint32_t offset; bool fixed_buf_size; - + uint32_t relative_base_offset; uint32_t relative_end_offset; - struct ndr_token_list *relative_base_list; + struct ndr_token_list relative_base_list; - struct ndr_token_list *switch_list; - struct ndr_token_list *relative_list; - struct ndr_token_list *relative_begin_list; - struct ndr_token_list *nbt_string_list; - struct ndr_token_list *dns_string_list; - struct ndr_token_list *full_ptr_list; + struct ndr_token_list switch_list; + struct ndr_token_list relative_list; + struct ndr_token_list relative_begin_list; + struct ndr_token_list nbt_string_list; + struct ndr_token_list dns_string_list; + struct ndr_token_list full_ptr_list; /* this is used to ensure we generate unique reference IDs */ uint32_t ptr_count; @@ -104,7 +110,7 @@ struct ndr_push { struct ndr_print { uint32_t flags; /* LIBNDR_FLAG_* */ uint32_t depth; - struct ndr_token_list *switch_list; + struct ndr_token_list switch_list; void (*print)(struct ndr_print *, const char *, ...) PRINTF_ATTRIBUTE(2,3); void *private_data; bool no_newline; @@ -534,12 +540,13 @@ enum ndr_err_code ndr_push_subcontext_end(struct ndr_push *ndr, size_t header_size, ssize_t size_is); enum ndr_err_code ndr_token_store(TALLOC_CTX *mem_ctx, - struct ndr_token_list **list, - const void *key, + struct ndr_token_list *list, + const void *key, uint32_t value); -enum ndr_err_code ndr_token_retrieve_cmp_fn(struct ndr_token_list **list, const void *key, uint32_t *v, int(*_cmp_fn)(const void*,const void*), bool _remove_tok); -enum ndr_err_code ndr_token_retrieve(struct ndr_token_list **list, const void *key, uint32_t *v); -uint32_t ndr_token_peek(struct ndr_token_list **list, const void *key); +enum ndr_err_code ndr_token_retrieve_cmp_fn(struct ndr_token_list *list, const void *key, uint32_t *v, + int(*_cmp_fn)(const void*,const void*), bool erase); +enum ndr_err_code ndr_token_retrieve(struct ndr_token_list *list, const void *key, uint32_t *v); +uint32_t ndr_token_peek(struct ndr_token_list *list, const void *key); enum ndr_err_code ndr_pull_array_size(struct ndr_pull *ndr, const void *p); uint32_t ndr_get_array_size(struct ndr_pull *ndr, const void *p); enum ndr_err_code ndr_check_array_size(struct ndr_pull *ndr, void *p, uint32_t size); diff --git a/librpc/ndr/ndr.c b/librpc/ndr/ndr.c index 22c4d76..108f04b 100644 --- a/librpc/ndr/ndr.c +++ b/librpc/ndr/ndr.c @@ -138,11 +138,11 @@ _PUBLIC_ enum ndr_err_code ndr_pull_pop(struct ndr_pull *ndr) return ndr_pull_error(ndr, NDR_ERR_RELATIVE, "%s", __location__); } - if (ndr->relative_list != NULL) { + if (ndr->relative_list.count != 0) { return ndr_pull_error(ndr, NDR_ERR_RELATIVE, "%s", __location__); } - if (ndr->relative_base_list != NULL) { + if (ndr->relative_base_list.count != 0) { return ndr_pull_error(ndr, NDR_ERR_RELATIVE, "%s", __location__); } @@ -918,36 +918,65 @@ _PUBLIC_ enum ndr_err_code ndr_push_subcontext_end(struct ndr_push *ndr, store a token in the ndr context, for later retrieval */ _PUBLIC_ enum ndr_err_code ndr_token_store(TALLOC_CTX *mem_ctx, - struct ndr_token_list **list, - const void *key, + struct ndr_token_list *list, + const void *key, uint32_t value) { - struct ndr_token_list *tok; - tok = talloc(mem_ctx, struct ndr_token_list); - NDR_ERR_HAVE_NO_MEMORY(tok); + struct ndr_token *tok; + if (list->count == list->alloc_count) { + unsigned new_alloc; + unsigned increment = MIN(list->count, 1000); + increment = MAX(increment, 10); + new_alloc = list->alloc_count + increment; + if (new_alloc < list->alloc_count) { + return NDR_ERR_RANGE; + } + list->alloc_count = new_alloc; + list->tokens = talloc_realloc(mem_ctx, list->tokens, + struct ndr_token, new_alloc); + if (list->tokens == NULL) { + NDR_ERR_HAVE_NO_MEMORY(list->tokens); + } + } + + tok = &list->tokens[list->count]; tok->key = key; tok->value = value; - DLIST_ADD((*list), tok); + list->count++; return NDR_ERR_SUCCESS; } /* retrieve a token from a ndr context, using cmp_fn to match the tokens */ -_PUBLIC_ enum ndr_err_code ndr_token_retrieve_cmp_fn(struct ndr_token_list **list, const void *key, uint32_t *v, - comparison_fn_t _cmp_fn, bool _remove_tok) -{ - struct ndr_token_list *tok; - for (tok=*list;tok;tok=tok->next) { - if (_cmp_fn && _cmp_fn(tok->key,key)==0) goto found; - else if (!_cmp_fn && tok->key == key) goto found; +_PUBLIC_ enum ndr_err_code ndr_token_retrieve_cmp_fn(struct ndr_token_list *list, + const void *key, uint32_t *v, + comparison_fn_t _cmp_fn, + bool erase) +{ + struct ndr_token *tokens = list->tokens; + unsigned i; + if (_cmp_fn) { + for (i = list->count - 1; i < list->count; i--) { + if (_cmp_fn(tokens[i].key, key)) { + goto found; + } + } + } else { + for (i = list->count - 1; i < list->count; i--) { + if (tokens[i].key == key) { + goto found; + } + } } return NDR_ERR_TOKEN; found: - *v = tok->value; - if (_remove_tok) { - DLIST_REMOVE((*list), tok); - talloc_free(tok); + *v = tokens[i].value; + if (erase) { + if (i != list->count - 1) { + tokens[i] = tokens[list->count - 1]; + } + list->count--; } return NDR_ERR_SUCCESS; } @@ -955,7 +984,7 @@ found: /* retrieve a token from a ndr context */ -_PUBLIC_ enum ndr_err_code ndr_token_retrieve(struct ndr_token_list **list, const void *key, uint32_t *v) +_PUBLIC_ enum ndr_err_code ndr_token_retrieve(struct ndr_token_list *list, const void *key, uint32_t *v) { return ndr_token_retrieve_cmp_fn(list, key, v, NULL, true); } @@ -963,14 +992,17 @@ _PUBLIC_ enum ndr_err_code ndr_token_retrieve(struct ndr_token_list **list, cons /* peek at but don't removed a token from a ndr context */ -_PUBLIC_ uint32_t ndr_token_peek(struct ndr_token_list **list, const void *key) +_PUBLIC_ uint32_t ndr_token_peek(struct ndr_token_list *list, const void *key) { - struct ndr_token_list *tok; - for (tok = *list; tok; tok = tok->next) { - if (tok->key == key) { - return tok->value; + unsigned i; + struct ndr_token *tokens = list->tokens; + + for (i = list->count - 1; i < list->count; i--) { + if (tokens[i].key == key) { + return tokens[i].value; } } + return 0; } diff --git a/librpc/wscript_build b/librpc/wscript_build index fdfe641..55a6f7a 100644 --- a/librpc/wscript_build +++ b/librpc/wscript_build @@ -715,7 +715,7 @@ bld.SAMBA_LIBRARY('ndr', public_deps='samba-errors talloc samba-util', public_headers='gen_ndr/misc.h gen_ndr/ndr_misc.h ndr/libndr.h:ndr.h', header_path= [('*gen_ndr*', 'gen_ndr')], - vnum='0.0.9', + vnum='0.1.0', abi_directory='ABI', abi_match='ndr_* GUID_*', ) -- 2.7.4 >From 498ad46c14e98987f7d2ff6f52479a32ad7c7ab3 Mon Sep 17 00:00:00 2001 From: Douglas Bagnall Date: Fri, 24 Feb 2017 11:59:24 +1300 Subject: [PATCH 4/4] ndr: fix whitespace in libndr.h, ndr.c Signed-off-by: Douglas Bagnall --- librpc/ndr/libndr.h | 20 ++++++++++---------- librpc/ndr/ndr.c | 54 ++++++++++++++++++++++++++--------------------------- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/librpc/ndr/libndr.h b/librpc/ndr/libndr.h index 8292ff0..1307741 100644 --- a/librpc/ndr/libndr.h +++ b/librpc/ndr/libndr.h @@ -1,25 +1,25 @@ -/* +/* Unix SMB/CIFS implementation. rpc interface definitions Copyright (C) Andrew Tridgell 2003 - + 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 . */ -/* This is a public header file that is installed as part of Samba. - * If you remove any functions or change their signature, update +/* This is a public header file that is installed as part of Samba. + * If you remove any functions or change their signature, update * the so version number. */ #ifndef __LIBNDR_H__ @@ -469,7 +469,7 @@ void ndr_print_dom_sid0(struct ndr_print *ndr, const char *name, const struct do size_t ndr_size_dom_sid0(const struct dom_sid *sid, int flags); void ndr_print_GUID(struct ndr_print *ndr, const char *name, const struct GUID *guid); void ndr_print_sockaddr_storage(struct ndr_print *ndr, const char *name, const struct sockaddr_storage *ss); -bool ndr_syntax_id_equal(const struct ndr_syntax_id *i1, const struct ndr_syntax_id *i2); +bool ndr_syntax_id_equal(const struct ndr_syntax_id *i1, const struct ndr_syntax_id *i2); char *ndr_syntax_id_to_string(TALLOC_CTX *mem_ctx, const struct ndr_syntax_id *id); bool ndr_syntax_id_from_string(const char *s, struct ndr_syntax_id *id); enum ndr_err_code ndr_push_struct_blob(DATA_BLOB *blob, TALLOC_CTX *mem_ctx, const void *p, ndr_push_flags_fn_t fn); @@ -514,7 +514,7 @@ void ndr_print_function_debug(ndr_print_function_t fn, const char *name, int fla char *ndr_print_struct_string(TALLOC_CTX *mem_ctx, ndr_print_fn_t fn, const char *name, void *ptr); char *ndr_print_union_string(TALLOC_CTX *mem_ctx, ndr_print_fn_t fn, const char *name, uint32_t level, void *ptr); char *ndr_print_function_string(TALLOC_CTX *mem_ctx, - ndr_print_function_t fn, const char *name, + ndr_print_function_t fn, const char *name, int flags, void *ptr); void ndr_set_flags(uint32_t *pflags, uint32_t new_flags); enum ndr_err_code ndr_pull_error(struct ndr_pull *ndr, @@ -573,7 +573,7 @@ enum ndr_err_code ndr_pull_union_blob_all(const DATA_BLOB *blob, TALLOC_CTX *mem #define NDR_SCALAR_PROTO(name, type) \ enum ndr_err_code ndr_push_ ## name(struct ndr_push *ndr, int ndr_flags, type v); \ enum ndr_err_code ndr_pull_ ## name(struct ndr_pull *ndr, int ndr_flags, type *v); \ -void ndr_print_ ## name(struct ndr_print *ndr, const char *var_name, type v); +void ndr_print_ ## name(struct ndr_print *ndr, const char *var_name, type v); #define NDR_SCALAR_PTR_PROTO(name, type) \ enum ndr_err_code ndr_push_ ## name(struct ndr_push *ndr, int ndr_flags, const type *v); \ @@ -583,7 +583,7 @@ void ndr_print_ ## name(struct ndr_print *ndr, const char *var_name, const type #define NDR_BUFFER_PROTO(name, type) \ enum ndr_err_code ndr_push_ ## name(struct ndr_push *ndr, int ndr_flags, const type *v); \ enum ndr_err_code ndr_pull_ ## name(struct ndr_pull *ndr, int ndr_flags, type *v); \ -void ndr_print_ ## name(struct ndr_print *ndr, const char *var_name, const type *v); +void ndr_print_ ## name(struct ndr_print *ndr, const char *var_name, const type *v); NDR_SCALAR_PROTO(uint8, uint8_t) NDR_SCALAR_PROTO(int8, int8_t) diff --git a/librpc/ndr/ndr.c b/librpc/ndr/ndr.c index 108f04b..3015aa1 100644 --- a/librpc/ndr/ndr.c +++ b/librpc/ndr/ndr.c @@ -187,7 +187,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_advance(struct ndr_pull *ndr, uint32_t size) { ndr->offset += size; if (ndr->offset > ndr->data_size) { - return ndr_pull_error(ndr, NDR_ERR_BUFSIZE, + return ndr_pull_error(ndr, NDR_ERR_BUFSIZE, "ndr_pull_advance by %u failed", size); } @@ -201,7 +201,7 @@ static enum ndr_err_code ndr_pull_set_offset(struct ndr_pull *ndr, uint32_t ofs) { ndr->offset = ofs; if (ndr->offset > ndr->data_size) { - return ndr_pull_error(ndr, NDR_ERR_BUFSIZE, + return ndr_pull_error(ndr, NDR_ERR_BUFSIZE, "ndr_pull_set_offset %u failed", ofs); } @@ -264,7 +264,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_expand(struct ndr_push *ndr, uint32_t extra_ "push_expand to %u", size); } - + if (ndr->alloc_size > size) { return NDR_ERR_SUCCESS; } @@ -314,7 +314,7 @@ _PUBLIC_ void ndr_print_debugc_helper(struct ndr_print *ndr, const char *format, free(s); } -_PUBLIC_ void ndr_print_debug_helper(struct ndr_print *ndr, const char *format, ...) +_PUBLIC_ void ndr_print_debug_helper(struct ndr_print *ndr, const char *format, ...) { va_list ap; char *s = NULL; @@ -343,7 +343,7 @@ _PUBLIC_ void ndr_print_debug_helper(struct ndr_print *ndr, const char *format, free(s); } -_PUBLIC_ void ndr_print_printf_helper(struct ndr_print *ndr, const char *format, ...) +_PUBLIC_ void ndr_print_printf_helper(struct ndr_print *ndr, const char *format, ...) { va_list ap; uint32_t i; @@ -375,7 +375,7 @@ _PUBLIC_ void ndr_print_string_helper(struct ndr_print *ndr, const char *format, } va_start(ap, format); - ndr->private_data = talloc_vasprintf_append_buffer((char *)ndr->private_data, + ndr->private_data = talloc_vasprintf_append_buffer((char *)ndr->private_data, format, ap); va_end(ap); if (!ndr->no_newline) { @@ -513,7 +513,7 @@ failed: a useful helper function for printing idl function calls to a string */ _PUBLIC_ char *ndr_print_function_string(TALLOC_CTX *mem_ctx, - ndr_print_function_t fn, const char *name, + ndr_print_function_t fn, const char *name, int flags, void *ptr) { struct ndr_print *ndr; @@ -598,7 +598,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_error(struct ndr_pull *ndr, */ _PUBLIC_ enum ndr_err_code ndr_push_error(struct ndr_push *ndr, enum ndr_err_code ndr_err, - const char *format, ...) + const char *format, ...) { char *s=NULL; va_list ap; @@ -754,7 +754,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_subcontext_start(struct ndr_pull *ndr, return NDR_ERR_SUCCESS; default: - return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext (PULL) header_size %d", + return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext (PULL) header_size %d", (int)header_size); } @@ -840,7 +840,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_subcontext_start(struct ndr_push *ndr, } /* - push a subcontext header + push a subcontext header */ _PUBLIC_ enum ndr_err_code ndr_push_subcontext_end(struct ndr_push *ndr, struct ndr_push *subndr, @@ -859,14 +859,14 @@ _PUBLIC_ enum ndr_err_code ndr_push_subcontext_end(struct ndr_push *ndr, } switch (header_size) { - case 0: + case 0: break; - case 2: + case 2: NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, subndr->offset)); break; - case 4: + case 4: NDR_CHECK(ndr_push_uint3264(ndr, NDR_SCALARS, subndr->offset)); break; @@ -906,7 +906,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_subcontext_end(struct ndr_push *ndr, break; default: - return ndr_push_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext header size %d", + return ndr_push_error(ndr, NDR_ERR_SUBCONTEXT, "Bad subcontext header size %d", (int)header_size); } @@ -1032,7 +1032,7 @@ _PUBLIC_ enum ndr_err_code ndr_check_array_size(struct ndr_pull *ndr, void *p, u uint32_t stored; stored = ndr_token_peek(&ndr->array_size_list, p); if (stored != size) { - return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, + return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size - got %u expected %u\n", stored, size); } @@ -1047,7 +1047,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_array_length(struct ndr_pull *ndr, const voi uint32_t length, offset; NDR_CHECK(ndr_pull_uint3264(ndr, NDR_SCALARS, &offset)); if (offset != 0) { - return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, + return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "non-zero array offset %u\n", offset); } NDR_CHECK(ndr_pull_uint3264(ndr, NDR_SCALARS, &length)); @@ -1070,7 +1070,7 @@ _PUBLIC_ enum ndr_err_code ndr_check_array_length(struct ndr_pull *ndr, void *p, uint32_t stored; stored = ndr_token_peek(&ndr->array_length_list, p); if (stored != length) { - return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, + return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array length - got %u expected %u\n", stored, length); } @@ -1178,7 +1178,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_struct_blob(const DATA_BLOB *blob, TALLOC_CT /* pull a struct from a blob using NDR - failing if all bytes are not consumed */ -_PUBLIC_ enum ndr_err_code ndr_pull_struct_blob_all(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, +_PUBLIC_ enum ndr_err_code ndr_pull_struct_blob_all(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, void *p, ndr_pull_flags_fn_t fn) { struct ndr_pull *ndr; @@ -1245,7 +1245,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_struct_blob_all_noalloc(const DATA_BLOB *blo /* pull a union from a blob using NDR, given the union discriminator */ -_PUBLIC_ enum ndr_err_code ndr_pull_union_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, +_PUBLIC_ enum ndr_err_code ndr_pull_union_blob(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, void *p, uint32_t level, ndr_pull_flags_fn_t fn) { @@ -1262,7 +1262,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_union_blob(const DATA_BLOB *blob, TALLOC_CTX pull a union from a blob using NDR, given the union discriminator, failing if all bytes are not consumed */ -_PUBLIC_ enum ndr_err_code ndr_pull_union_blob_all(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, +_PUBLIC_ enum ndr_err_code ndr_pull_union_blob_all(const DATA_BLOB *blob, TALLOC_CTX *mem_ctx, void *p, uint32_t level, ndr_pull_flags_fn_t fn) { @@ -1307,9 +1307,9 @@ _PUBLIC_ enum ndr_err_code ndr_push_struct_blob(DATA_BLOB *blob, TALLOC_CTX *mem return NDR_ERR_SUCCESS; } -/* - push a struct into a provided blob using NDR. - +/* + push a struct into a provided blob using NDR. + We error because we want to have the performance issue (extra talloc() calls) show up as an error, not just slower code. This is used for things like GUIDs, which we expect to be a fixed size, and @@ -1490,16 +1490,16 @@ static enum ndr_err_code ndr_push_relative_ptr2(struct ndr_push *ndr, const void save_offset = ndr->offset; NDR_CHECK(ndr_token_retrieve(&ndr->relative_list, p, &ptr_offset)); if (ptr_offset > ndr->offset) { - return ndr_push_error(ndr, NDR_ERR_BUFSIZE, + return ndr_push_error(ndr, NDR_ERR_BUFSIZE, "ndr_push_relative_ptr2 ptr_offset(%u) > ndr->offset(%u)", ptr_offset, ndr->offset); } ndr->offset = ptr_offset; if (save_offset < ndr->relative_base_offset) { - return ndr_push_error(ndr, NDR_ERR_BUFSIZE, + return ndr_push_error(ndr, NDR_ERR_BUFSIZE, "ndr_push_relative_ptr2 save_offset(%u) < ndr->relative_base_offset(%u)", save_offset, ndr->relative_base_offset); - } + } NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, save_offset - ndr->relative_base_offset)); ndr->offset = save_offset; return NDR_ERR_SUCCESS; @@ -1759,7 +1759,7 @@ _PUBLIC_ enum ndr_err_code ndr_pull_relative_ptr1(struct ndr_pull *ndr, const vo { rel_offset += ndr->relative_base_offset; if (rel_offset > ndr->data_size) { - return ndr_pull_error(ndr, NDR_ERR_BUFSIZE, + return ndr_pull_error(ndr, NDR_ERR_BUFSIZE, "ndr_pull_relative_ptr1 rel_offset(%u) > ndr->data_size(%u)", rel_offset, ndr->data_size); } -- 2.7.4