1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-09 08:58:35 +03:00

repl_meta_data: Remove el_count from replmd_delete_internals()

Instead, use the actual found attribute (less error prone).

This is an attempt to fix:

./source4/dsdb/repl/replicated_objects.c:945 Failed to prepare commit of transaction:
attribute isDeleted: invalid modify flags on CN=g1_1527558311141,CN=Users,DC=samba,DC=example,DC=com: 0x0

Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Garming Sam <garming@catalyst.net.nz>
This commit is contained in:
Andrew Bartlett 2018-05-29 16:52:14 +12:00
parent 400abe837c
commit 9564adb66f

View File

@ -3976,7 +3976,12 @@ static int replmd_delete_internals(struct ldb_module *module, struct ldb_request
"*",
NULL
};
unsigned int i, el_count = 0;
static const struct ldb_val true_val = {
.data = discard_const_p(uint8_t, "TRUE"),
.length = 4
};
unsigned int i;
uint32_t dsdb_flags = 0;
struct replmd_private *replmd_private;
enum deletion_state deletion_state, next_deletion_state;
@ -4127,6 +4132,7 @@ static int replmd_delete_internals(struct ldb_module *module, struct ldb_request
guid = samdb_result_guid(old_msg, "objectGUID");
if (deletion_state == OBJECT_NOT_DELETED) {
struct ldb_message_element *is_deleted_el;
ret = replmd_make_deleted_child_dn(tmp_ctx,
ldb,
@ -4139,14 +4145,15 @@ static int replmd_delete_internals(struct ldb_module *module, struct ldb_request
return ret;
}
ret = ldb_msg_add_string(msg, "isDeleted", "TRUE");
ret = ldb_msg_add_value(msg, "isDeleted", &true_val,
&is_deleted_el);
if (ret != LDB_SUCCESS) {
ldb_asprintf_errstring(ldb, __location__
": Failed to add isDeleted string to the msg");
talloc_free(tmp_ctx);
return ret;
}
msg->elements[el_count++].flags = LDB_FLAG_MOD_REPLACE;
is_deleted_el->flags = LDB_FLAG_MOD_REPLACE;
} else {
/*
* No matter what has happened with other renames etc, try again to
@ -4195,6 +4202,7 @@ static int replmd_delete_internals(struct ldb_module *module, struct ldb_request
if (deletion_state == OBJECT_NOT_DELETED) {
struct ldb_dn *parent_dn = ldb_dn_get_parent(tmp_ctx, old_dn);
char *parent_dn_str = NULL;
struct ldb_message_element *p_el;
/* we need the storage form of the parent GUID */
ret = dsdb_module_search_dn(module, tmp_ctx, &parent_res,
@ -4238,7 +4246,13 @@ static int replmd_delete_internals(struct ldb_module *module, struct ldb_request
talloc_free(tmp_ctx);
return ret;
}
msg->elements[el_count++].flags = LDB_FLAG_MOD_REPLACE;
p_el = ldb_msg_find_element(msg,
"lastKnownParent");
if (p_el == NULL) {
talloc_free(tmp_ctx);
return ldb_module_operr(module);
}
p_el->flags = LDB_FLAG_MOD_REPLACE;
if (next_deletion_state == OBJECT_DELETED) {
ret = ldb_msg_add_value(msg, "msDS-LastKnownRDN", rdn_value, NULL);
@ -4250,7 +4264,13 @@ static int replmd_delete_internals(struct ldb_module *module, struct ldb_request
talloc_free(tmp_ctx);
return ret;
}
msg->elements[el_count++].flags = LDB_FLAG_MOD_ADD;
p_el = ldb_msg_find_element(msg,
"msDS-LastKnownRDN");
if (p_el == NULL) {
talloc_free(tmp_ctx);
return ldb_module_operr(module);
}
p_el->flags = LDB_FLAG_MOD_ADD;
}
}
@ -4279,14 +4299,17 @@ static int replmd_delete_internals(struct ldb_module *module, struct ldb_request
* not activated and what ever the forest level is.
*/
if (dsdb_attribute_by_lDAPDisplayName(schema, "isRecycled") != NULL) {
ret = ldb_msg_add_string(msg, "isRecycled", "TRUE");
struct ldb_message_element *is_recycled_el;
ret = ldb_msg_add_value(msg, "isRecycled", &true_val,
&is_recycled_el);
if (ret != LDB_SUCCESS) {
DEBUG(0,(__location__ ": Failed to add isRecycled string to the msg\n"));
ldb_module_oom(module);
talloc_free(tmp_ctx);
return ret;
}
msg->elements[el_count++].flags = LDB_FLAG_MOD_REPLACE;
is_recycled_el->flags = LDB_FLAG_MOD_REPLACE;
}
replmd_private = talloc_get_type(ldb_module_get_private(module),