diff options
| author | Andrew Bartlett <abartlet@samba.org> | 2009-10-12 13:17:09 +1100 | 
|---|---|---|
| committer | Andrew Bartlett <abartlet@samba.org> | 2009-10-12 16:51:03 +1100 | 
| commit | d511d889a09dee93338d93fcef22625089ae110c (patch) | |
| tree | 99b500e2d8ff490f6ebe9dfaf6b86589fdaba8a1 | |
| parent | aee3c190156ed6f644535ab62ffe72b74e611b43 (diff) | |
| download | samba-d511d889a09dee93338d93fcef22625089ae110c.tar.gz samba-d511d889a09dee93338d93fcef22625089ae110c.tar.bz2 samba-d511d889a09dee93338d93fcef22625089ae110c.zip | |
s4:schema Add some error checking to the schema load
| -rw-r--r-- | source4/dsdb/schema/schema_inferiors.c | 27 | ||||
| -rw-r--r-- | source4/dsdb/schema/schema_set.c | 5 | 
2 files changed, 25 insertions, 7 deletions
| diff --git a/source4/dsdb/schema/schema_inferiors.c b/source4/dsdb/schema/schema_inferiors.c index 3be97b6b83..ecac74a954 100644 --- a/source4/dsdb/schema/schema_inferiors.c +++ b/source4/dsdb/schema/schema_inferiors.c @@ -149,19 +149,22 @@ void schema_subclasses_order_recurse(struct dsdb_schema *schema, struct dsdb_cla  	return;  } -static void schema_create_subclasses(struct dsdb_schema *schema) +static int schema_create_subclasses(struct dsdb_schema *schema)  { -	struct dsdb_class *schema_class; +	struct dsdb_class *schema_class, *top;  	for (schema_class=schema->classes; schema_class; schema_class=schema_class->next) {  		struct dsdb_class *schema_class2 = dsdb_class_by_lDAPDisplayName(schema, schema_class->subClassOf);  		if (schema_class2 == NULL) {  			DEBUG(0,("ERROR: no subClassOf for '%s'\n", schema_class->lDAPDisplayName)); -			continue; +			return LDB_ERR_OPERATIONS_ERROR;  		}  		if (schema_class2 && schema_class != schema_class2) {  			if (schema_class2->subclasses_direct == NULL) {  				schema_class2->subclasses_direct = str_list_make_empty(schema_class2); +				if (!schema_class2->subclasses_direct) { +					return LDB_ERR_OPERATIONS_ERROR; +				}  			}  			schema_class2->subclasses_direct = str_list_add_const(schema_class2->subclasses_direct,   									schema_class->lDAPDisplayName); @@ -175,7 +178,14 @@ static void schema_create_subclasses(struct dsdb_schema *schema)  		schema_class->subClass_order = 0;  	} -	schema_subclasses_order_recurse(schema, dsdb_class_by_lDAPDisplayName(schema, "top"), 1); +	top = dsdb_class_by_lDAPDisplayName(schema, "top"); +	if (!top) { +		DEBUG(0,("ERROR: no 'top' class in loaded schema\n")); +		return LDB_ERR_OPERATIONS_ERROR; +	} + +	schema_subclasses_order_recurse(schema, top, 1); +	return LDB_SUCCESS;  }  static void schema_fill_possible_inferiors(struct dsdb_schema *schema, struct dsdb_class *schema_class) @@ -294,13 +304,17 @@ static void schema_fill_from_ids(struct dsdb_schema *schema)  	}  } -void schema_fill_constructed(struct dsdb_schema *schema)  +int schema_fill_constructed(struct dsdb_schema *schema)   { +	int ret;  	struct dsdb_class *schema_class;  	schema_fill_from_ids(schema); -	schema_create_subclasses(schema); +	ret = schema_create_subclasses(schema); +	if (ret != LDB_SUCCESS) { +		return ret; +	}  	for (schema_class=schema->classes; schema_class; schema_class=schema_class->next) {  		schema_fill_possible_inferiors(schema, schema_class); @@ -318,4 +332,5 @@ void schema_fill_constructed(struct dsdb_schema *schema)  		schema_class->subclasses = NULL;  		schema_class->posssuperiors = NULL;  	} +	return LDB_SUCCESS;  } diff --git a/source4/dsdb/schema/schema_set.c b/source4/dsdb/schema/schema_set.c index 6f09f63596..9f22b32334 100644 --- a/source4/dsdb/schema/schema_set.c +++ b/source4/dsdb/schema/schema_set.c @@ -346,7 +346,10 @@ int dsdb_set_schema(struct ldb_context *ldb, struct dsdb_schema *schema)  		return ret;  	} -	schema_fill_constructed(schema); +	ret = schema_fill_constructed(schema); +	if (ret != LDB_SUCCESS) { +		return ret; +	}  	ret = ldb_set_opaque(ldb, "dsdb_schema", schema);  	if (ret != LDB_SUCCESS) { | 
