The branch, master has been updated via d76bb4a s4-drs: Check for schema changes only in case we are *not* applying Schema replica via 1fac1f0 werror: Add W_ERROR_HAVE_NO_MEMORY_AND_FREE() macro via c3489a7 s4-ldapcmp: Fix options parsing for common Samba options from 78b6265 s3:rpc_client: remove unused rpc_pipe_set_hnd_state()
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit d76bb4ac409ff7f95776302bb436c7dec55adb26 Author: Kamen Mazdrashki <kame...@samba.org> Date: Sat Sep 18 15:09:22 2010 +0300 s4-drs: Check for schema changes only in case we are *not* applying Schema replica This fixes the problem when we fail to replicate with a partner DC that has a newer Schema with attributeSchema objects with OIDs that we don't have in our local prefixMap. commit 1fac1f0d2882ae9ac81a02fa6d9957f6cb3fb88d Author: Kamen Mazdrashki <kame...@samba.org> Date: Sat Sep 18 02:28:29 2010 +0300 werror: Add W_ERROR_HAVE_NO_MEMORY_AND_FREE() macro commit c3489a7918758848953f00cee6a36519cd059daf Author: Kamen Mazdrashki <kame...@samba.org> Date: Sat Sep 18 00:44:17 2010 +0300 s4-ldapcmp: Fix options parsing for common Samba options And also set 'creds2' to be equal to 'creds' in case username2 paramater is not supplied on cmd line ----------------------------------------------------------------------- Summary of changes: libcli/util/werror.h | 7 +++++++ source4/dsdb/repl/replicated_objects.c | 27 +++++++++++++++++++-------- source4/scripting/devel/ldapcmp | 14 ++++++++++---- 3 files changed, 36 insertions(+), 12 deletions(-) Changeset truncated at 500 lines: diff --git a/libcli/util/werror.h b/libcli/util/werror.h index 3b717d2..d89cd9c 100644 --- a/libcli/util/werror.h +++ b/libcli/util/werror.h @@ -48,6 +48,13 @@ typedef uint32_t WERROR; }\ } while (0) +#define W_ERROR_HAVE_NO_MEMORY_AND_FREE(x, ctx) do { \ + if (!(x)) {\ + talloc_free(ctx); \ + return WERR_NOMEM;\ + }\ +} while (0) + #define W_ERROR_IS_OK_RETURN(x) do { \ if (W_ERROR_IS_OK(x)) {\ return x;\ diff --git a/source4/dsdb/repl/replicated_objects.c b/source4/dsdb/repl/replicated_objects.c index 838dc84..0beb53c 100644 --- a/source4/dsdb/repl/replicated_objects.c +++ b/source4/dsdb/repl/replicated_objects.c @@ -197,7 +197,7 @@ WERROR dsdb_convert_object_ex(struct ldb_context *ldb, } WERROR dsdb_extended_replicated_objects_convert(struct ldb_context *ldb, - const char *partition_dn, + const char *partition_dn_str, const struct drsuapi_DsReplicaOIDMapping_Ctr *mapping_ctr, uint32_t object_count, const struct drsuapi_DsReplicaObjectListItemEx *first_object, @@ -210,6 +210,7 @@ WERROR dsdb_extended_replicated_objects_convert(struct ldb_context *ldb, struct dsdb_extended_replicated_objects **objects) { WERROR status; + struct ldb_dn *partition_dn; const struct dsdb_schema *schema; struct dsdb_extended_replicated_objects *out; const struct drsuapi_DsReplicaObjectListItemEx *cur; @@ -226,14 +227,24 @@ WERROR dsdb_extended_replicated_objects_convert(struct ldb_context *ldb, return WERR_DS_SCHEMA_NOT_LOADED; } - status = dsdb_schema_pfm_contains_drsuapi_pfm(schema->prefixmap, mapping_ctr); - if (!W_ERROR_IS_OK(status)) { - talloc_free(out); - return status; + partition_dn = ldb_dn_new(out, ldb, partition_dn_str); + W_ERROR_HAVE_NO_MEMORY_AND_FREE(partition_dn, out); + + if (ldb_dn_compare(partition_dn, ldb_get_schema_basedn(ldb)) != 0) { + /* + * check for schema changes in case + * we are not replicating Schema NC + */ + status = dsdb_schema_info_cmp(schema, mapping_ctr); + if (!W_ERROR_IS_OK(status)) { + DEBUG(1,("Remote schema has changed while replicating %s\n", + partition_dn_str)); + talloc_free(out); + return status; + } } - out->partition_dn = ldb_dn_new(out, ldb, partition_dn); - W_ERROR_HAVE_NO_MEMORY(out->partition_dn); + out->partition_dn = partition_dn; out->source_dsa = source_dsa; out->uptodateness_vector= uptodateness_vector; @@ -242,7 +253,7 @@ WERROR dsdb_extended_replicated_objects_convert(struct ldb_context *ldb, out->objects = talloc_array(out, struct dsdb_extended_replicated_object, out->num_objects); - W_ERROR_HAVE_NO_MEMORY(out->objects); + W_ERROR_HAVE_NO_MEMORY_AND_FREE(out->objects, out); /* pass the linked attributes down to the repl_meta_data module */ diff --git a/source4/scripting/devel/ldapcmp b/source4/scripting/devel/ldapcmp index 76b4e8e..edf37d3 100755 --- a/source4/scripting/devel/ldapcmp +++ b/source4/scripting/devel/ldapcmp @@ -518,13 +518,10 @@ class LDAPBundel(object): if __name__ == "__main__": parser = OptionParser("ldapcmp [options] domain|configuration|schema") sambaopts = options.SambaOptions(parser) + parser.add_option_group(sambaopts) credopts = options.CredentialsOptionsDouble(parser) parser.add_option_group(credopts) - lp = sambaopts.get_loadparm() - creds = credopts.get_credentials(lp) - creds2 = credopts.get_credentials2(lp) - parser.add_option("", "--host", dest="host", help="IP of the first LDAP server",) parser.add_option("", "--host2", dest="host2", @@ -537,6 +534,15 @@ if __name__ == "__main__": help="Print all DN pairs that have been compared",) (opts, args) = parser.parse_args() + lp = sambaopts.get_loadparm() + creds = credopts.get_credentials(lp) + creds2 = credopts.get_credentials2(lp) + if creds2.is_anonymous(): + creds2 = creds + + if creds.is_anonymous(): + parser.error("You must supply at least one username/password pair") + if not (len(args) == 1 and args[0].upper() in ["DOMAIN", "CONFIGURATION", "SCHEMA"]): parser.error("Incorrect arguments") -- Samba Shared Repository