dsdb-schema: make sure use clean caches in schema_inferiors.c
authorStefan Metzmacher <metze@samba.org>
Thu, 17 Jan 2013 13:40:24 +0000 (14:40 +0100)
committerStefan Metzmacher <metze@samba.org>
Mon, 21 Jan 2013 15:12:44 +0000 (16:12 +0100)
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
source4/dsdb/schema/schema.h
source4/dsdb/schema/schema_inferiors.c

index eb288e6bf9648c4e6a20b3d39816955b83d0c6c0..66df1c5f75ec5bf670d47f5e59040d4610bcdc5f 100644 (file)
@@ -166,10 +166,6 @@ struct dsdb_class {
        bool isDefunct;
        bool systemOnly;
 
-       const char **supclasses;
-       const char **subclasses;
-       const char **subclasses_direct;
-       const char **posssuperiors;
        uint32_t subClassOf_id;
        uint32_t *systemAuxiliaryClass_ids;
        uint32_t *auxiliaryClass_ids;
@@ -186,6 +182,13 @@ struct dsdb_class {
         * subClasses of top are 2, subclasses of those classes are
         * 3 */ 
        uint32_t subClass_order;
+
+       struct {
+               const char **supclasses;
+               const char **subclasses;
+               const char **subclasses_direct;
+               const char **posssuperiors;
+       } tmp;
 };
 
 /**
index 73bea5b799d7aab9e6852ef881af3b139e350fe4..14699c74678faa258af812c40e9cc1ca424d541f 100644 (file)
@@ -39,8 +39,8 @@ static const char **schema_supclasses(const struct dsdb_schema *schema,
 {
        const char **list;
 
-       if (schema_class->supclasses) {
-               return schema_class->supclasses;
+       if (schema_class->tmp.supclasses) {
+               return schema_class->tmp.supclasses;
        }
 
        list = const_str_list(str_list_make_empty(schema_class));
@@ -52,7 +52,7 @@ static const char **schema_supclasses(const struct dsdb_schema *schema,
        /* Cope with 'top SUP top', i.e. top is subClassOf top */
        if (schema_class->subClassOf &&
            strcmp(schema_class->lDAPDisplayName, schema_class->subClassOf) == 0) {
-               schema_class->supclasses = list;
+               schema_class->tmp.supclasses = list;
                return list;
        }
 
@@ -65,9 +65,9 @@ static const char **schema_supclasses(const struct dsdb_schema *schema,
                list = str_list_append_const(list, list2);
        }
 
-       schema_class->supclasses = str_list_unique(list);
+       schema_class->tmp.supclasses = str_list_unique(list);
 
-       return schema_class->supclasses;
+       return schema_class->tmp.supclasses;
 }
 
 /*
@@ -87,7 +87,7 @@ static const char **schema_subclasses(const struct dsdb_schema *schema,
                        DEBUG(0, ("ERROR: Unable to locate subClass: '%s'\n", oclist[i]));
                        continue;
                }
-               list = str_list_append_const(list, schema_class->subclasses);
+               list = str_list_append_const(list, schema_class->tmp.subclasses);
        }
        return list;
 }
@@ -99,7 +99,7 @@ static const char **schema_subclasses(const struct dsdb_schema *schema,
 static const char **schema_posssuperiors(const struct dsdb_schema *schema,
                                         struct dsdb_class *schema_class)
 {
-       if (schema_class->posssuperiors == NULL) {
+       if (schema_class->tmp.posssuperiors == NULL) {
                const char **list2 = const_str_list(str_list_make_empty(schema_class));
                const char **list3;
                unsigned int i;
@@ -118,16 +118,16 @@ static const char **schema_posssuperiors(const struct dsdb_schema *schema,
                }
                list2 = str_list_append_const(list2, schema_subclasses(schema, list2, list2));
 
-               schema_class->posssuperiors = str_list_unique(list2);
+               schema_class->tmp.posssuperiors = str_list_unique(list2);
        }
 
-       return schema_class->posssuperiors;
+       return schema_class->tmp.posssuperiors;
 }
 
 static const char **schema_subclasses_recurse(const struct dsdb_schema *schema,
                                              struct dsdb_class *schema_class)
 {
-       const char **list = str_list_copy_const(schema_class, schema_class->subclasses_direct);
+       const char **list = str_list_copy_const(schema_class, schema_class->tmp.subclasses_direct);
        unsigned int i;
        for (i=0;list && list[i]; i++) {
                const struct dsdb_class *schema_class2 = dsdb_class_by_lDAPDisplayName(schema, list[i]);
@@ -145,7 +145,7 @@ static void schema_subclasses_order_recurse(const struct dsdb_schema *schema,
                                            struct dsdb_class *schema_class,
                                            const int order)
 {
-       const char **list = schema_class->subclasses_direct;
+       const char **list = schema_class->tmp.subclasses_direct;
        unsigned int i;
        schema_class->subClass_order = order;
        for (i=0;list && list[i]; i++) {
@@ -169,19 +169,19 @@ static int schema_create_subclasses(const struct dsdb_schema *schema)
                        return LDB_ERR_OPERATIONS_ERROR;
                }
                if (schema_class2 && schema_class != schema_class2) {
-                       if (schema_class2->subclasses_direct == NULL) {
-                               schema_class2->subclasses_direct = const_str_list(str_list_make_empty(schema_class2));
-                               if (!schema_class2->subclasses_direct) {
+                       if (schema_class2->tmp.subclasses_direct == NULL) {
+                               schema_class2->tmp.subclasses_direct = const_str_list(str_list_make_empty(schema_class2));
+                               if (!schema_class2->tmp.subclasses_direct) {
                                        return LDB_ERR_OPERATIONS_ERROR;
                                }
                        }
-                       schema_class2->subclasses_direct = str_list_add_const(schema_class2->subclasses_direct,
+                       schema_class2->tmp.subclasses_direct = str_list_add_const(schema_class2->tmp.subclasses_direct,
                                                schema_class->lDAPDisplayName);
                }
        }
 
        for (schema_class=schema->classes; schema_class; schema_class=schema_class->next) {
-               schema_class->subclasses = str_list_unique(schema_subclasses_recurse(schema, schema_class));
+               schema_class->tmp.subclasses = str_list_unique(schema_subclasses_recurse(schema, schema_class));
 
                /* Initialize the subClass order, to ensure we can't have uninitialized sort on the subClass hierarchy */
                schema_class->subClass_order = 0;
@@ -329,6 +329,11 @@ int schema_fill_constructed(const struct dsdb_schema *schema)
        int ret;
        struct dsdb_class *schema_class;
 
+       /* make sure we start with a clean cache */
+       for (schema_class=schema->classes; schema_class; schema_class=schema_class->next) {
+               ZERO_STRUCT(schema_class->tmp);
+       }
+
        schema_fill_from_ids(schema);
 
        ret = schema_create_subclasses(schema);
@@ -343,14 +348,10 @@ int schema_fill_constructed(const struct dsdb_schema *schema)
 
        /* free up our internal cache elements */
        for (schema_class=schema->classes; schema_class; schema_class=schema_class->next) {
-               talloc_free(schema_class->supclasses);
-               talloc_free(schema_class->subclasses_direct);
-               talloc_free(schema_class->subclasses);
-               talloc_free(schema_class->posssuperiors);
-               schema_class->supclasses = NULL;
-               schema_class->subclasses_direct = NULL;
-               schema_class->subclasses = NULL;
-               schema_class->posssuperiors = NULL;
+               TALLOC_FREE(schema_class->tmp.supclasses);
+               TALLOC_FREE(schema_class->tmp.subclasses_direct);
+               TALLOC_FREE(schema_class->tmp.subclasses);
+               TALLOC_FREE(schema_class->tmp.posssuperiors);
        }
 
        return LDB_SUCCESS;