From 79dd22aacb4c12bd008d9ad354ec5ec088560748 Mon Sep 17 00:00:00 2001 From: Clive Ferreira Date: Tue, 11 Oct 2016 15:32:54 +1300 Subject: objectclass_attrs: Only abort on a missing attribute when an attribute is both MUST and replicated If an attribute is not replicated or constructed, it is quite normal for it to be missing. This is the case with both rIDNextRid and rIDPreviousAllocationPool. This currently prevents us switching the RID master. On Windows, missing this attribute does not cause any problems for the RID manager. We may now remove the knownfail entry added earlier. Signed-off-by: Clive Ferreira Reviewed-by: Andrew Bartlett Pair-programmed-with: Garming Sam Pair-programmed-with: Bob Campbell BUG: https://bugzilla.samba.org/show_bug.cgi?id=12394 Autobuild-User(master): Garming Sam Autobuild-Date(master): Wed Nov 2 01:28:44 CET 2016 on sn-devel-144 --- source4/dsdb/samdb/ldb_modules/objectclass_attrs.c | 23 ++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) (limited to 'source4/dsdb/samdb/ldb_modules/objectclass_attrs.c') diff --git a/source4/dsdb/samdb/ldb_modules/objectclass_attrs.c b/source4/dsdb/samdb/ldb_modules/objectclass_attrs.c index 616cff83482..e239fb946e7 100644 --- a/source4/dsdb/samdb/ldb_modules/objectclass_attrs.c +++ b/source4/dsdb/samdb/ldb_modules/objectclass_attrs.c @@ -426,12 +426,23 @@ static int attr_handler2(struct oc_context *ac) * replicated. */ if (found_must_contain[0] != NULL && - ldb_msg_check_string_attribute(msg, "isDeleted", "TRUE") == 0 && - ldb_request_get_control(ac->req, DSDB_CONTROL_DBCHECK) == NULL) { - ldb_asprintf_errstring(ldb, "objectclass_attrs: at least one mandatory attribute ('%s') on entry '%s' wasn't specified!", - found_must_contain[0], - ldb_dn_get_linearized(msg->dn)); - return LDB_ERR_OBJECT_CLASS_VIOLATION; + ldb_msg_check_string_attribute(msg, "isDeleted", "TRUE") == 0) { + + for (i = 0; found_must_contain[i] != NULL; i++) { + const struct dsdb_attribute *broken_attr = dsdb_attribute_by_lDAPDisplayName(ac->schema, + found_must_contain[i]); + + bool replicated = (broken_attr->systemFlags & + (DS_FLAG_ATTR_NOT_REPLICATED | DS_FLAG_ATTR_IS_CONSTRUCTED)) == 0; + + if (replicated) { + ldb_asprintf_errstring(ldb, "objectclass_attrs: at least one mandatory " + "attribute ('%s') on entry '%s' wasn't specified!", + found_must_contain[i], + ldb_dn_get_linearized(msg->dn)); + return LDB_ERR_OBJECT_CLASS_VIOLATION; + } + } } if (isSchemaAttr) { -- cgit v1.2.1