[SCM] Samba Shared Repository - branch master updated

Andrew Tridgell tridge at samba.org
Fri Nov 27 19:29:10 MST 2009


The branch, master has been updated
       via  1287c1d... s4-drs: cope with bogus empty attributes from w2k8-r2
      from  db41a0a... s4: fix SD update and password change in upgrade script

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 1287c1d115fb7e8f3954bc05ff65007968403a9c
Author: Andrew Tridgell <tridge at samba.org>
Date:   Sat Nov 28 13:27:06 2009 +1100

    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.

-----------------------------------------------------------------------

Summary of changes:
 source4/dsdb/repl/replicated_objects.c |   17 +++++++++++++++++
 1 files changed, 17 insertions(+), 0 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/dsdb/repl/replicated_objects.c b/source4/dsdb/repl/replicated_objects.c
index 020d5f1..a8a93e4 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);


-- 
Samba Shared Repository


More information about the samba-cvs mailing list