The branch, master has been updated via e717af0 s4-dsdb: Do not assume that all deleted objects have an objectCategory and sAMAccountType via f55328a dsdb: Do not attempt to resolve conflicts on an RODC via 5505418 dsdb: fix double-free in replication failure case on RODC via 5c5d869 s4-dsdb Allow repl server to start even when no master NCs are present from 2d6571d Add missing com_err dependencies Signed-off-by: Jelmer Vernooij <jel...@samba.org>
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit e717af030146db7bc298a581b030cb7535614e0f Author: Andrew Bartlett <abart...@samba.org> Date: Fri Sep 30 14:33:38 2011 -0700 s4-dsdb: Do not assume that all deleted objects have an objectCategory and sAMAccountType Autobuild-User: Andrew Bartlett <abart...@samba.org> Autobuild-Date: Thu Oct 6 03:43:13 CEST 2011 on sn-devel-104 commit f55328a295b4fb11bea8efc8888d73e3573deb21 Author: Andrew Bartlett <abart...@samba.org> Date: Thu Sep 29 18:56:38 2011 -0700 dsdb: Do not attempt to resolve conflicts on an RODC commit 55054182b2989c6432e20a61c9b281596d5682ef Author: Andrew Bartlett <abart...@samba.org> Date: Thu Sep 29 18:53:51 2011 -0700 dsdb: fix double-free in replication failure case on RODC commit 5c5d86997593fd7ed9efc0f214f2e978c13083ac Author: Andrew Bartlett <abart...@samba.org> Date: Thu Sep 29 17:05:38 2011 -0700 s4-dsdb Allow repl server to start even when no master NCs are present ----------------------------------------------------------------------- Summary of changes: source4/dsdb/repl/drepl_partitions.c | 8 +----- source4/dsdb/samdb/ldb_modules/repl_meta_data.c | 34 +++++++++++++++++++--- 2 files changed, 30 insertions(+), 12 deletions(-) Changeset truncated at 500 lines: diff --git a/source4/dsdb/repl/drepl_partitions.c b/source4/dsdb/repl/drepl_partitions.c index 934c75e..7c54245 100644 --- a/source4/dsdb/repl/drepl_partitions.c +++ b/source4/dsdb/repl/drepl_partitions.c @@ -63,14 +63,8 @@ WERROR dreplsrv_load_partitions(struct dreplsrv_service *s) } el = ldb_msg_find_element(res->msgs[0], "hasMasterNCs"); - if (!el) { - DEBUG(1,("Finding hasMasterNCs element in root_res failed: %s\n", - ldb_errstring(s->samdb))); - talloc_free(tmp_ctx); - return WERR_DS_DRA_INTERNAL_ERROR; - } - for (i=0; i<el->num_values; i++) { + for (i=0; el && i<el->num_values; i++) { struct ldb_dn *pdn; struct dreplsrv_partition *p; diff --git a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c index 7a64242..fff542a 100644 --- a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c +++ b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c @@ -2560,7 +2560,7 @@ static int replmd_rename_callback(struct ldb_request *req, struct ldb_reply *are lpcfg_dnsdomain(lp_ctx), ldb_dn_get_linearized(olddn)); ret = ldb_module_send_referral(req, referral); - talloc_free(ac); + talloc_free(ares); return ldb_module_done(req, NULL, NULL, ret); } @@ -2931,14 +2931,14 @@ static int replmd_delete(struct ldb_module *module, struct ldb_request *req) } msg->elements[el_count++].flags = LDB_FLAG_MOD_ADD; - ret = ldb_msg_add_empty(msg, "objectCategory", LDB_FLAG_MOD_DELETE, NULL); + ret = ldb_msg_add_empty(msg, "objectCategory", LDB_FLAG_MOD_REPLACE, NULL); if (ret != LDB_SUCCESS) { talloc_free(tmp_ctx); ldb_module_oom(module); return ret; } - ret = ldb_msg_add_empty(msg, "sAMAccountType", LDB_FLAG_MOD_DELETE, NULL); + ret = ldb_msg_add_empty(msg, "sAMAccountType", LDB_FLAG_MOD_REPLACE, NULL); if (ret != LDB_SUCCESS) { talloc_free(tmp_ctx); ldb_module_oom(module); @@ -3286,7 +3286,7 @@ static int replmd_op_add_callback(struct ldb_request *req, struct ldb_reply *are const struct ldb_val *rmd_value, *omd_value; struct replPropertyMetaDataBlob omd, rmd; enum ndr_err_code ndr_err; - bool rename_incoming_record; + bool rename_incoming_record, rodc; struct replPropertyMetaData1 *rmd_name, *omd_name; if (ares->error != LDB_ERR_ENTRY_ALREADY_EXISTS) { @@ -3295,7 +3295,31 @@ static int replmd_op_add_callback(struct ldb_request *req, struct ldb_reply *are return replmd_op_callback(req, ares); } - /* + ret = samdb_rodc(ldb_module_get_ctx(ar->module), &rodc); + if (ret != LDB_SUCCESS) { + return ret; + } + /* + * we have a conflict, and need to decide if we will keep the + * new record or the old record + */ + conflict_dn = req->op.add.message->dn; + + if (rodc) { + /* + * We are on an RODC, or were a GC for this + * partition, so we have to fail this until + * someone who owns the partition sorts it + * out + */ + ldb_asprintf_errstring(ldb_module_get_ctx(ar->module), + "Conflict adding object '%s' from incoming replication as we are read only for the partition. \n" + " - We must fail the operation until a master for this partition resolves the conflict", + ldb_dn_get_linearized(conflict_dn)); + goto failed; + } + + /* * we have a conflict, and need to decide if we will keep the * new record or the old record */ -- Samba Shared Repository