From 55b25e1e23882fb8eb476408790b12f03a5d65e8 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 9 Aug 2011 11:47:25 +1000 Subject: s4-dsdb: ensure we setup the dn_format field in schema attributes this ensures we setup dn_format when we do runtime schema changes Pair-Programmed-With: Andrew Bartlett --- source4/dsdb/schema/schema_inferiors.c | 31 -------------------------- source4/dsdb/schema/schema_set.c | 40 ++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 31 deletions(-) (limited to 'source4') diff --git a/source4/dsdb/schema/schema_inferiors.c b/source4/dsdb/schema/schema_inferiors.c index fe456412d1..d2c134ea9e 100644 --- a/source4/dsdb/schema/schema_inferiors.c +++ b/source4/dsdb/schema/schema_inferiors.c @@ -328,7 +328,6 @@ int schema_fill_constructed(const struct dsdb_schema *schema) { int ret; struct dsdb_class *schema_class; - struct dsdb_attribute *attribute; schema_fill_from_ids(schema); @@ -354,35 +353,5 @@ int schema_fill_constructed(const struct dsdb_schema *schema) schema_class->posssuperiors = NULL; } - /* setup fast access to one_way_link and DN format */ - for (attribute=schema->attributes; attribute; attribute=attribute->next) { - attribute->dn_format = dsdb_dn_oid_to_format(attribute->syntax->ldap_oid); - - if (attribute->dn_format == DSDB_INVALID_DN) { - attribute->one_way_link = false; - continue; - } - - /* these are not considered to be one way links for - the purpose of DN link fixups */ - if (ldb_attr_cmp("distinguishedName", attribute->lDAPDisplayName) == 0 || - ldb_attr_cmp("objectCategory", attribute->lDAPDisplayName) == 0) { - attribute->one_way_link = false; - continue; - } - - if (attribute->linkID == 0) { - attribute->one_way_link = true; - continue; - } - /* handle attributes with a linkID but no backlink */ - if (dsdb_attribute_by_linkID(schema, attribute->linkID) == NULL) { - attribute->one_way_link = true; - continue; - } - attribute->one_way_link = false; - } - - return LDB_SUCCESS; } diff --git a/source4/dsdb/schema/schema_set.c b/source4/dsdb/schema/schema_set.c index 9dee0a4eec..1c1e45ef78 100644 --- a/source4/dsdb/schema/schema_set.c +++ b/source4/dsdb/schema/schema_set.c @@ -200,6 +200,44 @@ op_error: return ldb_operr(ldb); } + +/* + create extra attribute shortcuts + */ +static void dsdb_setup_attribute_shortcuts(struct ldb_context *ldb, struct dsdb_schema *schema) +{ + struct dsdb_attribute *attribute; + + /* setup fast access to one_way_link and DN format */ + for (attribute=schema->attributes; attribute; attribute=attribute->next) { + attribute->dn_format = dsdb_dn_oid_to_format(attribute->syntax->ldap_oid); + + if (attribute->dn_format == DSDB_INVALID_DN) { + attribute->one_way_link = false; + continue; + } + + /* these are not considered to be one way links for + the purpose of DN link fixups */ + if (ldb_attr_cmp("distinguishedName", attribute->lDAPDisplayName) == 0 || + ldb_attr_cmp("objectCategory", attribute->lDAPDisplayName) == 0) { + attribute->one_way_link = false; + continue; + } + + if (attribute->linkID == 0) { + attribute->one_way_link = true; + continue; + } + /* handle attributes with a linkID but no backlink */ + if (dsdb_attribute_by_linkID(schema, attribute->linkID) == NULL) { + attribute->one_way_link = true; + continue; + } + attribute->one_way_link = false; + } +} + static int uint32_cmp(uint32_t c1, uint32_t c2) { if (c1 == c2) return 0; @@ -354,6 +392,8 @@ int dsdb_setup_sorted_accessors(struct ldb_context *ldb, TYPESAFE_QSORT(schema->attributes_by_attributeID_oid, schema->num_attributes, dsdb_compare_attribute_by_attributeID_oid); TYPESAFE_QSORT(schema->attributes_by_linkID, schema->num_attributes, dsdb_compare_attribute_by_linkID); + dsdb_setup_attribute_shortcuts(ldb, schema); + return LDB_SUCCESS; failed: -- cgit