[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