diff options
author | Andrew Bartlett <abartlet@samba.org> | 2010-06-30 10:20:11 +1000 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2010-06-30 10:22:59 +1000 |
commit | 32b8b401d6de27caa02a258fd540a208c486d1d6 (patch) | |
tree | 4b6368af4049b06a42cb5303dc1db5ec6917720c /source4/dsdb/schema | |
parent | 73fbc9c1791c2391ccb59a2a02df009cbd2fdc7e (diff) | |
download | samba-32b8b401d6de27caa02a258fd540a208c486d1d6.tar.gz samba-32b8b401d6de27caa02a258fd540a208c486d1d6.tar.bz2 samba-32b8b401d6de27caa02a258fd540a208c486d1d6.zip |
s4:dsdb Fix possible schema segfaults for DRS-replication based schema
The problem here is that if the schema has been modified on the source
domain, there may be attributes that appear over DRS with 0 values (to
indicate that any existing values on the target should be deleted).
This would confuse the previous version of this macro.
Andrew Bartlett
Diffstat (limited to 'source4/dsdb/schema')
-rw-r--r-- | source4/dsdb/schema/schema_init.c | 30 |
1 files changed, 13 insertions, 17 deletions
diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c index 2cf5af685d..bb22df18bb 100644 --- a/source4/dsdb/schema/schema_init.c +++ b/source4/dsdb/schema/schema_init.c @@ -471,17 +471,13 @@ static int dsdb_schema_setup_ldb_schema_attribute(struct ldb_context *ldb, } \ } while (0) -#define GET_STRING_LIST_LDB(msg, attr, mem_ctx, p, elem, strict) do { \ +#define GET_STRING_LIST_LDB(msg, attr, mem_ctx, p, elem) do { \ int get_string_list_counter; \ struct ldb_message_element *get_string_list_el = ldb_msg_find_element(msg, attr); \ - if (get_string_list_el == NULL) { \ - if (strict) { \ - d_printf("%s: %s == NULL\n", __location__, attr); \ - return WERR_INVALID_PARAM; \ - } else { \ - (p)->elem = NULL; \ - break; \ - } \ + /* We may get empty attributes over the replication channel */ \ + if (get_string_list_el == NULL || get_string_list_el->num_values == 0) { \ + (p)->elem = NULL; \ + break; \ } \ (p)->elem = talloc_array(mem_ctx, const char *, get_string_list_el->num_values + 1); \ for (get_string_list_counter=0; \ @@ -683,16 +679,16 @@ WERROR dsdb_class_from_ldb(struct dsdb_schema *schema, GET_STRING_LDB(msg, "subClassOf", obj, obj, subClassOf, true); - GET_STRING_LIST_LDB(msg, "systemAuxiliaryClass", obj, obj, systemAuxiliaryClass, false); - GET_STRING_LIST_LDB(msg, "auxiliaryClass", obj, obj, auxiliaryClass, false); + GET_STRING_LIST_LDB(msg, "systemAuxiliaryClass", obj, obj, systemAuxiliaryClass); + GET_STRING_LIST_LDB(msg, "auxiliaryClass", obj, obj, auxiliaryClass); - GET_STRING_LIST_LDB(msg, "systemMustContain", obj, obj, systemMustContain, false); - GET_STRING_LIST_LDB(msg, "systemMayContain", obj, obj, systemMayContain, false); - GET_STRING_LIST_LDB(msg, "mustContain", obj, obj, mustContain, false); - GET_STRING_LIST_LDB(msg, "mayContain", obj, obj, mayContain, false); + GET_STRING_LIST_LDB(msg, "systemMustContain", obj, obj, systemMustContain); + GET_STRING_LIST_LDB(msg, "systemMayContain", obj, obj, systemMayContain); + GET_STRING_LIST_LDB(msg, "mustContain", obj, obj, mustContain); + GET_STRING_LIST_LDB(msg, "mayContain", obj, obj, mayContain); - GET_STRING_LIST_LDB(msg, "systemPossSuperiors", obj, obj, systemPossSuperiors, false); - GET_STRING_LIST_LDB(msg, "possSuperiors", obj, obj, possSuperiors, false); + GET_STRING_LIST_LDB(msg, "systemPossSuperiors", obj, obj, systemPossSuperiors); + GET_STRING_LIST_LDB(msg, "possSuperiors", obj, obj, possSuperiors); GET_STRING_LDB(msg, "defaultSecurityDescriptor", obj, obj, defaultSecurityDescriptor, false); |