[SCM] Samba Shared Repository - branch master updated

Stefan Metzmacher metze at samba.org
Wed Nov 3 13:13:01 MDT 2010


The branch, master has been updated
       via  d1dd211 replace/wscript: add size checks for stdint.h types
       via  f5a6c1e replace/wscript: do the size checks directly after the type checks
       via  811a362 replace/wscript: define bool to int instead of off_t
       via  3dcec24 replace/wscript: check for uint8_t
       via  05088fb s4:dsdb/samldb: avoid nested unindexed searches in samldb_member_check()
       via  54d4ba7 s4:dsdb/tests/python/sam.py: test with member: <SID=...>
      from  4b79a74 s4:descriptor LDB module - a bit cleanup

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


- Log -----------------------------------------------------------------
commit d1dd2117dbdf1eb082d77a187b46f8cd6792338a
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Nov 3 17:40:39 2010 +0100

    replace/wscript: add size checks for stdint.h types
    
    metze
    
    Autobuild-User: Stefan Metzmacher <metze at samba.org>
    Autobuild-Date: Wed Nov  3 19:12:39 UTC 2010 on sn-devel-104

commit f5a6c1e6dcea3b47c45a3fe18a3966739650f593
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Nov 3 17:40:12 2010 +0100

    replace/wscript: do the size checks directly after the type checks
    
    metze

commit 811a36282a61347ac39a339e54900dbfbb7504d9
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Nov 3 17:35:47 2010 +0100

    replace/wscript: define bool to int instead of off_t
    
    metze

commit 3dcec24173f3be916c1a74c46a942651ccf950d1
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Nov 3 17:34:35 2010 +0100

    replace/wscript: check for uint8_t
    
    metze

commit 05088fb855a1fc043c3f75d01742cdbbfbb3330e
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Nov 3 12:34:47 2010 +0100

    s4:dsdb/samldb: avoid nested unindexed searches in samldb_member_check()
    
    With 20000 objects in the database it's no fun to add members...
    
    metze

commit 54d4ba7103d15a096cdd08ac21fca30811fbd48c
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Nov 3 17:41:10 2010 +0100

    s4:dsdb/tests/python/sam.py: test with member: <SID=...>
    
    metze

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

Summary of changes:
 lib/replace/wscript                     |   12 +++++---
 source4/dsdb/samdb/ldb_modules/samldb.c |   45 +++++++++++++++++++++---------
 source4/dsdb/tests/python/sam.py        |   16 +++++++++++
 3 files changed, 54 insertions(+), 19 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/replace/wscript b/lib/replace/wscript
index da788a1..0bfe660 100644
--- a/lib/replace/wscript
+++ b/lib/replace/wscript
@@ -74,7 +74,9 @@ def configure(conf):
     conf.CHECK_TYPES('"long long" intptr_t uintptr_t ptrdiff_t comparison_fn_t')
     conf.CHECK_TYPE('_Bool', define='HAVE__Bool')
 
+    conf.CHECK_TYPE('bool', 'int')
     conf.CHECK_TYPE('int8_t', 'char')
+    conf.CHECK_TYPE('uint8_t', 'unsigned char')
     conf.CHECK_TYPE('int16_t', 'short')
     conf.CHECK_TYPE('uint16_t', 'unsigned short')
     conf.CHECK_TYPE('int32_t', 'int')
@@ -85,11 +87,15 @@ def configure(conf):
     conf.CHECK_TYPE('ssize_t', 'int')
     conf.CHECK_TYPE('ino_t', 'unsigned')
     conf.CHECK_TYPE('loff_t', 'off_t')
-    conf.CHECK_TYPE('bool', 'off_t')
     conf.CHECK_TYPE('offset_t', 'loff_t')
     conf.CHECK_TYPE('volatile int', define='HAVE_VOLATILE')
     conf.CHECK_TYPE('uint_t', 'unsigned int')
 
+    conf.CHECK_SIZEOF('bool char int "long long" long short size_t ssize_t')
+    conf.CHECK_SIZEOF('int8_t uint8_t int16_t uint16_t int32_t uint32_t int64_t uint64_t')
+    conf.CHECK_SIZEOF('void*', define='SIZEOF_VOID_P')
+    conf.CHECK_SIZEOF('off_t dev_t ino_t time_t')
+
     conf.CHECK_TYPES('socklen_t', headers='sys/socket.h')
     conf.CHECK_TYPE_IN('struct ifaddrs', 'ifaddrs.h')
     conf.CHECK_TYPE_IN('struct addrinfo', 'netdb.h')
@@ -218,10 +224,6 @@ def configure(conf):
     conf.CHECK_DECLS('environ getgrent_r getpwent_r', reverse=True, headers='pwd.h grp.h')
     conf.CHECK_DECLS('pread pwrite setenv setresgid setresuid', reverse=True)
 
-    conf.CHECK_SIZEOF('char int "long long" long off_t short size_t ssize_t')
-    conf.CHECK_SIZEOF('dev_t ino_t time_t')
-    conf.CHECK_SIZEOF('void*', define='SIZEOF_VOID_P')
-
     if conf.CONFIG_SET('HAVE_EPOLL_CREATE') and conf.CONFIG_SET('HAVE_SYS_EPOLL_H'):
         conf.DEFINE('HAVE_EPOLL', 1)
 
diff --git a/source4/dsdb/samdb/ldb_modules/samldb.c b/source4/dsdb/samdb/ldb_modules/samldb.c
index 73776ab..be8eb1a 100644
--- a/source4/dsdb/samdb/ldb_modules/samldb.c
+++ b/source4/dsdb/samdb/ldb_modules/samldb.c
@@ -1368,13 +1368,33 @@ static int samldb_sam_accountname_check(struct samldb_ctx *ac)
 
 static int samldb_member_check(struct samldb_ctx *ac)
 {
+	static const char * const attrs[] = { "objectSid", "member", NULL };
 	struct ldb_context *ldb = ldb_module_get_ctx(ac->module);
 	struct ldb_message_element *el;
-	struct ldb_dn *member_dn, *group_dn;
+	struct ldb_dn *member_dn;
 	uint32_t prim_group_rid;
 	struct dom_sid *sid;
+	struct ldb_result *res;
+	struct dom_sid *group_sid;
 	unsigned int i, j;
 	int cnt;
+	int ret;
+
+	/* Fetch informations from the existing object */
+
+	ret = ldb_search(ldb, ac, &res, ac->msg->dn, LDB_SCOPE_BASE, attrs,
+			 NULL);
+	if (ret != LDB_SUCCESS) {
+		return ret;
+	}
+	if (res->count != 1) {
+		return ldb_operr(ldb);
+	}
+
+	group_sid = samdb_result_dom_sid(res, res->msgs[0], "objectSid");
+	if (group_sid == NULL) {
+		return ldb_operr(ldb);
+	}
 
 	/* We've to walk over all modification entries and consider the "member"
 	 * ones. */
@@ -1385,6 +1405,8 @@ static int samldb_member_check(struct samldb_ctx *ac)
 
 		el = &ac->msg->elements[i];
 		for (j = 0; j < el->num_values; j++) {
+			struct ldb_message_element *mo;
+
 			member_dn = ldb_dn_from_ldb_val(ac, ldb,
 							&el->values[j]);
 			if (!ldb_dn_validate(member_dn)) {
@@ -1404,12 +1426,14 @@ static int samldb_member_check(struct samldb_ctx *ac)
 			 *   ERR_NO_SUCH_ATTRIBUTE!)
 			 * - primary group check
 			 */
-			cnt = samdb_search_count(ldb, ac, ac->msg->dn,
-						 "(member=%s)",
-						 ldb_dn_get_linearized(member_dn));
-			if (cnt < 0) {
-				return ldb_operr(ldb);
+			mo = samdb_find_attribute(ldb, res->msgs[0], "member",
+						  ldb_dn_get_linearized(member_dn));
+			if (mo == NULL) {
+				cnt = 0;
+			} else {
+				cnt = 1;
 			}
+
 			if ((cnt > 0) && (LDB_FLAG_MOD_TYPE(el->flags)
 			    == LDB_FLAG_MOD_ADD)) {
 				return LDB_ERR_ENTRY_ALREADY_EXISTS;
@@ -1440,14 +1464,7 @@ static int samldb_member_check(struct samldb_ctx *ac)
 				return ldb_operr(ldb);
 			}
 
-			group_dn = samdb_search_dn(ldb, ac, NULL,
-						   "(objectSid=%s)",
-						   ldap_encode_ndr_dom_sid(ac, sid));
-			if (group_dn == NULL) {
-				return ldb_operr(ldb);
-			}
-
-			if (ldb_dn_compare(group_dn, ac->msg->dn) == 0) {
+			if (dom_sid_equal(group_sid, sid)) {
 				return LDB_ERR_ENTRY_ALREADY_EXISTS;
 			}
 		}
diff --git a/source4/dsdb/tests/python/sam.py b/source4/dsdb/tests/python/sam.py
index e1dbc6b..245d051 100755
--- a/source4/dsdb/tests/python/sam.py
+++ b/source4/dsdb/tests/python/sam.py
@@ -531,6 +531,22 @@ class SamTests(unittest.TestCase):
         except LdbError, (num, _):
             self.assertEquals(num, ERR_ENTRY_ALREADY_EXISTS)
 
+        # Already added, but as <SID=...>
+        res1 = ldb.search("cn=ldaptestuser,cn=users," + self.base_dn,
+                          scope=SCOPE_BASE, attrs=["objectSid"])
+        self.assertTrue(len(res1) == 1)
+        sid_bin = res1[0]["objectSid"][0]
+        sid_str = ("<SID=" + ldb.schema_format_value("objectSid", sid_bin) + ">").upper()
+
+        m = Message()
+        m.dn = Dn(ldb, "cn=ldaptestgroup2,cn=users," + self.base_dn)
+        m["member"] = MessageElement(sid_str, FLAG_MOD_ADD, "member")
+        try:
+            ldb.modify(m)
+            self.fail()
+        except LdbError, (num, _):
+            self.assertEquals(num, ERR_ENTRY_ALREADY_EXISTS)
+
         # Invalid member
         m = Message()
         m.dn = Dn(ldb, "cn=ldaptestgroup2,cn=users," + self.base_dn)


-- 
Samba Shared Repository


More information about the samba-cvs mailing list