summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNadezhda Ivanova <nadezhda.ivanova@postpath.com>2009-12-15 12:02:20 +0200
committerNadezhda Ivanova <nadezhda.ivanova@postpath.com>2009-12-15 12:02:20 +0200
commit4deaa84ce4a425bfba4b2612d79cc6fa1e00cca5 (patch)
treeee19276386889add1aeeba6547373853416d4018
parentef5508bc7864dcd7128cf91017407efede7572d2 (diff)
downloadsamba-4deaa84ce4a425bfba4b2612d79cc6fa1e00cca5.tar.gz
samba-4deaa84ce4a425bfba4b2612d79cc6fa1e00cca5.tar.bz2
samba-4deaa84ce4a425bfba4b2612d79cc6fa1e00cca5.zip
Fixed a problem with duplicate values of allowedAttributesEffective.
-rw-r--r--source4/dsdb/samdb/ldb_modules/acl.c4
-rw-r--r--source4/dsdb/schema/schema_query.c11
2 files changed, 13 insertions, 2 deletions
diff --git a/source4/dsdb/samdb/ldb_modules/acl.c b/source4/dsdb/samdb/ldb_modules/acl.c
index 45aa294667..dcd015b2a5 100644
--- a/source4/dsdb/samdb/ldb_modules/acl.c
+++ b/source4/dsdb/samdb/ldb_modules/acl.c
@@ -431,7 +431,9 @@ static int acl_allowedAttributes(struct ldb_module *module,
return LDB_ERR_OPERATIONS_ERROR;
}
/* remove constructed attributes */
- if (attr->systemFlags & DS_FLAG_ATTR_IS_CONSTRUCTED) {
+ if (attr->systemFlags & DS_FLAG_ATTR_IS_CONSTRUCTED
+ || attr->systemOnly
+ || (attr->linkID != 0 && attr->linkID % 2 != 0 )) {
continue;
}
ret = acl_check_access_on_attribute(module,
diff --git a/source4/dsdb/schema/schema_query.c b/source4/dsdb/schema/schema_query.c
index 0a58f7a23c..f563f01272 100644
--- a/source4/dsdb/schema/schema_query.c
+++ b/source4/dsdb/schema/schema_query.c
@@ -350,6 +350,14 @@ static const char **dsdb_full_attribute_list_internal_el(TALLOC_CTX *mem_ctx,
return attr_list;
}
+static int qsort_string(const void *v1,
+ const void *v2)
+{
+ char * const *s1 = v1;
+ char * const *s2 = v2;
+ return strcasecmp(*s1, *s2);
+}
+
/* Helper function to remove duplicates from the attribute list to be returned */
static const char **dedup_attr_list(const char **attr_list)
{
@@ -359,13 +367,14 @@ static const char **dedup_attr_list(const char **attr_list)
int i;
qsort(attr_list, new_len,
sizeof(*attr_list),
- (comparison_fn_t)strcasecmp);
+ (comparison_fn_t)qsort_string);
for (i=1 ; i < new_len; i++) {
const char **val1 = &attr_list[i-1];
const char **val2 = &attr_list[i];
if (ldb_attr_cmp(*val1, *val2) == 0) {
memmove(val1, val2, (new_len - i) * sizeof( *attr_list));
+ attr_list[new_len-1] = NULL;
new_len--;
i--;
}