summaryrefslogtreecommitdiff
path: root/source4/dsdb
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2009-11-28 13:27:06 +1100
committerAndrew Tridgell <tridge@samba.org>2009-11-28 13:28:34 +1100
commit1287c1d115fb7e8f3954bc05ff65007968403a9c (patch)
treeedaa1300d18129f2986803c8db33d9e02d862b09 /source4/dsdb
parentdb41a0afc6412934e166b8a3ed428ce549ba7c66 (diff)
downloadsamba-1287c1d115fb7e8f3954bc05ff65007968403a9c.tar.gz
samba-1287c1d115fb7e8f3954bc05ff65007968403a9c.tar.bz2
samba-1287c1d115fb7e8f3954bc05ff65007968403a9c.zip
s4-drs: cope with bogus empty attributes from w2k8-r2
w2k8-r2 sometimes sends empty attributes with completely bogus attrid values in a DRS replication response. This allows us to continue with the vampire operation despite these broken elements.
Diffstat (limited to 'source4/dsdb')
-rw-r--r--source4/dsdb/repl/replicated_objects.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/source4/dsdb/repl/replicated_objects.c b/source4/dsdb/repl/replicated_objects.c
index 020d5f1b07..a8a93e413a 100644
--- a/source4/dsdb/repl/replicated_objects.c
+++ b/source4/dsdb/repl/replicated_objects.c
@@ -129,6 +129,15 @@ static WERROR dsdb_convert_object_ex(struct ldb_context *ldb,
}
status = dsdb_attribute_drsuapi_to_ldb(ldb, schema, a, msg->elements, e);
+ if (!NT_STATUS_IS_OK(status) && a->value_ctr.num_values == 0) {
+ /* w2k8-r2 occasionally sends bogus empty
+ attributes with rubbish attribute IDs. The
+ only think we can do is discard these */
+ DEBUG(0,(__location__ ": Discarding bogus empty DsReplicaAttribute with attid 0x%x\n",
+ a->attid));
+ ZERO_STRUCTP(e);
+ continue;
+ }
W_ERROR_NOT_OK_RETURN(status);
m->attid = a->attid;
@@ -149,6 +158,14 @@ static WERROR dsdb_convert_object_ex(struct ldb_context *ldb,
}
}
+ /* delete any empty elements */
+ for (i=0; i < msg->num_elements; i++) {
+ if (msg->elements[i].name == NULL) {
+ ldb_msg_remove_element(msg, &msg->elements[i]);
+ i--;
+ }
+ }
+
if (rdn_m) {
struct ldb_message_element *el;
el = ldb_msg_find_element(msg, rdn_attr->lDAPDisplayName);