From: Tim Beale Date: Sun, 11 Nov 2018 22:13:28 +0000 (+1300) Subject: replmd: Move where we update the usnChanged/whenChanged X-Git-Tag: tdb-1.3.17~708 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f53954d0fd4d67c73336e9fda81429df9c55d77a;p=thirdparty%2Fsamba.git replmd: Move where we update the usnChanged/whenChanged Move this closer to where the source object actually gets modified. The main reason to do this is that adding fields can cause the msg->elements to be reallocated, which will invalidate all the old_el and pdn_list pointers which are derived from the msg. Signed-off-by: Tim Beale Reviewed-by: Andrew Bartlett --- diff --git a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c index b97c9db355f..88c5b6c9c4f 100644 --- a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c +++ b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c @@ -7947,7 +7947,6 @@ static int replmd_process_linked_attribute(struct ldb_module *module, struct dsdb_dn *dsdb_dn = NULL; uint64_t seq_num = 0; struct ldb_message_element *old_el; - time_t t = time(NULL); struct parsed_dn *pdn_list, *pdn, *next; struct GUID guid = GUID_zero(); bool active = (la->flags & DRSUAPI_DS_LINKED_ATTRIBUTE_FLAG_ACTIVE)?true:false; @@ -8142,22 +8141,6 @@ static int replmd_process_linked_attribute(struct ldb_module *module, } } - /* we only change whenChanged and uSNChanged if the seq_num - has changed */ - ldb_msg_remove_attr(msg, "whenChanged"); - ldb_msg_remove_attr(msg, "uSNChanged"); - ret = add_time_element(msg, "whenChanged", t); - if (ret != LDB_SUCCESS) { - ldb_operr(ldb); - return ret; - } - - ret = add_uint64_element(ldb, msg, "uSNChanged", seq_num); - if (ret != LDB_SUCCESS) { - ldb_operr(ldb); - return ret; - } - old_el = ldb_msg_find_element(msg, attr->lDAPDisplayName); if (old_el == NULL) { return ldb_operr(ldb); @@ -8229,6 +8212,8 @@ static int replmd_process_la_group(struct ldb_module *module, const struct dsdb_attribute *attr = NULL; replmd_link_changed change_type; uint32_t num_changes = 0; + time_t t; + uint64_t seq_num = 0; /* * get the attribute being modified and the search result for the @@ -8308,6 +8293,26 @@ static int replmd_process_la_group(struct ldb_module *module, return LDB_SUCCESS; } + /* update whenChanged/uSNChanged as the object has changed */ + t = time(NULL); + ret = ldb_sequence_number(ldb, LDB_SEQ_HIGHEST_SEQ, + &seq_num); + if (ret != LDB_SUCCESS) { + return ret; + } + + ret = add_time_element(msg, "whenChanged", t); + if (ret != LDB_SUCCESS) { + ldb_operr(ldb); + return ret; + } + + ret = add_uint64_element(ldb, msg, "uSNChanged", seq_num); + if (ret != LDB_SUCCESS) { + ldb_operr(ldb); + return ret; + } + /* apply the link changes to the source object */ ret = linked_attr_modify(module, msg, NULL); if (ret != LDB_SUCCESS) {