diff options
author | Andrew Tridgell <tridge@samba.org> | 2009-11-28 13:27:06 +1100 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 2009-11-28 13:28:34 +1100 |
commit | 1287c1d115fb7e8f3954bc05ff65007968403a9c (patch) | |
tree | edaa1300d18129f2986803c8db33d9e02d862b09 /source4/dsdb/repl | |
parent | db41a0afc6412934e166b8a3ed428ce549ba7c66 (diff) | |
download | samba-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/repl')
-rw-r--r-- | source4/dsdb/repl/replicated_objects.c | 17 |
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); |