From 63cf6814016d4a68a49773b1cf282bc78f42d5ba Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Mon, 11 Mar 2019 13:29:40 +1300 Subject: [PATCH 1/2] samba-tool dbcheck: Avoid creating child DNs via ldb.Dn() format arguments If we call dn.add_base() we avoid a problematic round-trip via the linearized DN. This has been particularly a problem in the python bindings, while now resolved, as strings are different between Python2 and Python3. [ mikhailnov: rediffed for v4.10.8 ] Signed-off-by: Andrew Bartlett Signed-off-by: Mikhail Novosyolov --- python/samba/dbchecker.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff -ruN samba-4.12.0_orig/python/samba/dbchecker.py samba-4.12.0/python/samba/dbchecker.py --- samba-4.12.0_orig/python/samba/dbchecker.py 2020-01-31 18:25:36.000000000 +0800 +++ samba-4.12.0/python/samba/dbchecker.py 2020-03-19 15:08:15.433649691 +0800 @@ -114,10 +114,17 @@ self.expired_tombstones = 0 self.reset_all_well_known_acls = False self.in_transaction = in_transaction - self.infrastructure_dn = ldb.Dn(samdb, "CN=Infrastructure," + samdb.domain_dn()) - self.naming_dn = ldb.Dn(samdb, "CN=Partitions,%s" % samdb.get_config_basedn()) + + self.infrastructure_dn = ldb.Dn(samdb, "CN=Infrastructure") + self.infrastructure_dn.add_base(samdb.domain_dn()) + + self.naming_dn = ldb.Dn(samdb, "CN=Partitions") + self.naming_dn.add_base(samdb.get_config_basedn()) + self.schema_dn = samdb.get_schema_basedn() - self.rid_dn = ldb.Dn(samdb, "CN=RID Manager$,CN=System," + samdb.domain_dn()) + self.rid_dn = ldb.Dn(samdb, "CN=RID Manager$,CN=System") + self.rid_dn.add_base(samdb.domain_dn()) + self.ntds_dsa = ldb.Dn(samdb, samdb.get_dsServiceName()) self.class_schemaIDGUID = {} self.wellknown_sds = get_wellknown_sds(self.samdb) @@ -192,7 +199,9 @@ if len(forest) == 1: self.dns_partitions.append((ldb.Dn(self.samdb, domaindns_zone), forest[0])) - fsmo_dn = ldb.Dn(self.samdb, "CN=RID Manager$,CN=System," + self.samdb.domain_dn()) + fsmo_dn = ldb.Dn(self.samdb, "CN=RID Manager$,CN=System") + fsmo_dn.add_base(self.samdb.domain_dn()) + rid_master = get_fsmo_roleowner(self.samdb, fsmo_dn, "rid") if ldb.Dn(self.samdb, self.samdb.get_dsServiceName()) == rid_master: self.is_rid_master = True @@ -2519,8 +2528,9 @@ controls += ["local_oid:%s:1" % dsdb.DSDB_CONTROL_DBCHECK_FIX_LINK_DN_NAME] if parent_dn is None: parent_dn = obj.dn.parent() - expected_dn = ldb.Dn(self.samdb, "RDN=RDN,%s" % (parent_dn)) + expected_dn = ldb.Dn(self.samdb, "RDN=RDN") expected_dn.set_component(0, obj.dn.get_rdn_name(), name_val) + expected_dn.add_base(parent_dn) if obj.dn == deleted_objects_dn: expected_dn = obj.dn -- 2.20.1