From 3fa5f84d2f7bdd3747ea14453fc49eb6931eeedf Mon Sep 17 00:00:00 2001 From: =?utf8?q?Matthias=20Dieter=20Walln=C3=B6fer?= Date: Wed, 4 Apr 2012 18:55:40 +0200 Subject: [PATCH] s4:dsdb - introduce a only constant-time "get_last_structural_class()" call With the redesign of the previous patches this has become possible. --- source4/dsdb/samdb/ldb_modules/descriptor.c | 6 +-- source4/dsdb/samdb/ldb_modules/objectclass.c | 9 ++--- source4/dsdb/samdb/ldb_modules/schema.c | 40 +++++++------------- 3 files changed, 18 insertions(+), 37 deletions(-) diff --git a/source4/dsdb/samdb/ldb_modules/descriptor.c b/source4/dsdb/samdb/ldb_modules/descriptor.c index f2afe742af0..0a4b1da39f9 100644 --- a/source4/dsdb/samdb/ldb_modules/descriptor.c +++ b/source4/dsdb/samdb/ldb_modules/descriptor.c @@ -542,8 +542,7 @@ static int descriptor_add(struct ldb_module *module, struct ldb_request *req) return ldb_operr(ldb); } - objectclass = get_last_structural_class(schema, objectclass_element, - true); + objectclass = get_last_structural_class(schema, objectclass_element); if (objectclass == NULL) { return ldb_operr(ldb); } @@ -661,8 +660,7 @@ static int descriptor_modify(struct ldb_module *module, struct ldb_request *req) return ldb_operr(ldb); } - objectclass = get_last_structural_class(schema, objectclass_element, - true); + objectclass = get_last_structural_class(schema, objectclass_element); if (objectclass == NULL) { return ldb_operr(ldb); } diff --git a/source4/dsdb/samdb/ldb_modules/objectclass.c b/source4/dsdb/samdb/ldb_modules/objectclass.c index b8422ee86ec..033330c86c2 100644 --- a/source4/dsdb/samdb/ldb_modules/objectclass.c +++ b/source4/dsdb/samdb/ldb_modules/objectclass.c @@ -470,8 +470,7 @@ static int objectclass_do_add(struct oc_context *ac) * unrelated structural classes */ objectclass = get_last_structural_class(ac->schema, - objectclass_element, - true); + objectclass_element); if (objectclass == NULL) { ldb_asprintf_errstring(ldb, "Failed to find a structural class for %s", @@ -955,8 +954,7 @@ static int objectclass_do_mod(struct oc_context *ac) * Get the new top-most structural object class and check for * unrelated structural classes */ - objectclass = get_last_structural_class(ac->schema, oc_el_entry, - true); + objectclass = get_last_structural_class(ac->schema, oc_el_entry); if (objectclass == NULL) { ldb_set_errstring(ldb, "objectclass: cannot delete all structural objectclasses!"); @@ -1132,8 +1130,7 @@ static int objectclass_do_rename2(struct oc_context *ac) /* existing entry without a valid object class? */ return ldb_operr(ldb); } - objectclass = get_last_structural_class(ac->schema, oc_el_entry, - false); + objectclass = get_last_structural_class(ac->schema, oc_el_entry); if (objectclass == NULL) { /* existing entry without a valid object class? */ return ldb_operr(ldb); diff --git a/source4/dsdb/samdb/ldb_modules/schema.c b/source4/dsdb/samdb/ldb_modules/schema.c index d24d388d25b..333fb1b0a68 100644 --- a/source4/dsdb/samdb/ldb_modules/schema.c +++ b/source4/dsdb/samdb/ldb_modules/schema.c @@ -31,43 +31,29 @@ /* * This function determines the (last) structural or 88 object class of a passed - * "objectClass" attribute. - * Without schema this does not work and hence NULL is returned. If the - * "objectClass" attribute has already been sorted then only a check on the - * last value is necessary (MS-ADTS 3.1.1.1.4) + * "objectClass" attribute - per MS-ADTS 3.1.1.1.4 this is the last value. + * Without schema this does not work and hence NULL is returned. */ const struct dsdb_class *get_last_structural_class(const struct dsdb_schema *schema, - const struct ldb_message_element *element, - bool sorted) + const struct ldb_message_element *element) { - const struct dsdb_class *last_class = NULL; - unsigned int i = 0; + const struct dsdb_class *last_class; if (schema == NULL) { return NULL; } - if (sorted && (element->num_values > 1)) { - i = element->num_values - 1; + if (element->num_values == 0) { + return NULL; } - for (; i < element->num_values; i++){ - const struct dsdb_class *tmp_class = dsdb_class_by_lDAPDisplayName_ldb_val(schema, &element->values[i]); - - if(tmp_class == NULL) { - continue; - } - - if(tmp_class->objectClassCategory > 1) { - continue; - } - - if (!last_class) { - last_class = tmp_class; - } else { - if (tmp_class->subClass_order > last_class->subClass_order) - last_class = tmp_class; - } + last_class = dsdb_class_by_lDAPDisplayName_ldb_val(schema, + &element->values[element->num_values-1]); + if (last_class == NULL) { + return NULL; + } + if (last_class->objectClassCategory > 1) { + return NULL; } return last_class; -- 2.34.1