[SCM] Samba Shared Repository - branch master updated - tevent-0-9-8-136-ga08d173

Andrew Tridgell tridge at samba.org
Wed Sep 9 22:29:09 MDT 2009


The branch, master has been updated
       via  a08d17342d0affa3769875ad87dadbb1f4161a06 (commit)
      from  689a9b88f9870687cd821a77184b95e16aa41ca9 (commit)

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


- Log -----------------------------------------------------------------
commit a08d17342d0affa3769875ad87dadbb1f4161a06
Author: Andrew Tridgell <tridge at samba.org>
Date:   Thu Sep 10 14:27:47 2009 +1000

    s4/drs: changed the UpdateRefs server to use the dn instead of the GUID
    
    Our vampire code sends a zero GUID in the updaterefs calls. Windows
    seems to ignore the GUID and use the DN in the naming context instead,
    so I have changed our UpdateRefs server implementation to do the same.
    
    With this change we can now vampire from s4<->s4 successfully! Now to
    see if all the attributes came across correctly.

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

Summary of changes:
 source4/rpc_server/drsuapi/updaterefs.c |   45 ++++++++++++------------------
 1 files changed, 18 insertions(+), 27 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/rpc_server/drsuapi/updaterefs.c b/source4/rpc_server/drsuapi/updaterefs.c
index a7712de..92027ba 100644
--- a/source4/rpc_server/drsuapi/updaterefs.c
+++ b/source4/rpc_server/drsuapi/updaterefs.c
@@ -38,23 +38,15 @@ struct repsTo {
 /*
   load the repsTo structure for a given partition GUID
  */
-static WERROR uref_loadreps(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx, struct GUID *guid,
+static WERROR uref_loadreps(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx, struct ldb_dn *dn,
 			    struct repsTo *reps)
 {
-	struct ldb_dn *dn;
 	const char *attrs[] = { "repsTo", NULL };
 	struct ldb_result *res;
 	TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
 	int i;
 	struct ldb_message_element *el;
 
-	if (dsdb_find_dn_by_guid(sam_ctx, tmp_ctx, GUID_string(tmp_ctx, guid), &dn) != LDB_SUCCESS) {
-		DEBUG(0,("drsuapi_addref: failed to find partition with GUID %s\n",
-			 GUID_string(tmp_ctx, guid)));
-		talloc_free(tmp_ctx);
-		return WERR_DS_DRA_BAD_NC;
-	}
-
 	/* TODO: possibly check in the rootDSE to see that this DN is
 	 * one of our partition roots */	 
 
@@ -99,22 +91,14 @@ static WERROR uref_loadreps(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx, st
 /*
   save the repsTo structure for a given partition GUID
  */
-static WERROR uref_savereps(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx, struct GUID *guid,
+static WERROR uref_savereps(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx, struct ldb_dn *dn,
 			    struct repsTo *reps)
 {
-	struct ldb_dn *dn;
 	TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
 	struct ldb_message *msg;
 	struct ldb_message_element *el;
 	int i;
 
-	if (dsdb_find_dn_by_guid(sam_ctx, tmp_ctx, GUID_string(tmp_ctx, guid), &dn) != LDB_SUCCESS) {
-		DEBUG(0,("drsuapi_addref: failed to find partition with GUID %s\n",
-			 GUID_string(tmp_ctx, guid)));
-		talloc_free(tmp_ctx);
-		return WERR_DS_DRA_BAD_NC;
-	}
-
 	msg = ldb_msg_new(tmp_ctx);
 	msg->dn = dn;
 	if (ldb_msg_add_empty(msg, "repsTo", LDB_FLAG_MOD_REPLACE, &el) != LDB_SUCCESS) {
@@ -159,12 +143,12 @@ failed:
   add a replication destination for a given partition GUID
  */
 static WERROR uref_add_dest(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx, 
-			    struct GUID *guid, struct repsFromTo1 *dest)
+			    struct ldb_dn *dn, struct repsFromTo1 *dest)
 {
 	struct repsTo reps;
 	WERROR werr;
 
-	werr = uref_loadreps(sam_ctx, mem_ctx, guid, &reps);
+	werr = uref_loadreps(sam_ctx, mem_ctx, dn, &reps);
 	if (!W_ERROR_IS_OK(werr)) {
 		return werr;
 	}
@@ -178,7 +162,7 @@ static WERROR uref_add_dest(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
 	reps.r[reps.count].ctr.ctr1 = *dest;
 	reps.count++;
 
-	werr = uref_savereps(sam_ctx, mem_ctx, guid, &reps);
+	werr = uref_savereps(sam_ctx, mem_ctx, dn, &reps);
 	if (!W_ERROR_IS_OK(werr)) {
 		return werr;
 	}
@@ -190,13 +174,13 @@ static WERROR uref_add_dest(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
   delete a replication destination for a given partition GUID
  */
 static WERROR uref_del_dest(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx, 
-			    struct GUID *guid, struct GUID *dest_guid)
+			    struct ldb_dn *dn, struct GUID *dest_guid)
 {
 	struct repsTo reps;
 	WERROR werr;
 	int i;
 
-	werr = uref_loadreps(sam_ctx, mem_ctx, guid, &reps);
+	werr = uref_loadreps(sam_ctx, mem_ctx, dn, &reps);
 	if (!W_ERROR_IS_OK(werr)) {
 		return werr;
 	}
@@ -210,7 +194,7 @@ static WERROR uref_del_dest(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
 		}
 	}
 
-	werr = uref_savereps(sam_ctx, mem_ctx, guid, &reps);
+	werr = uref_savereps(sam_ctx, mem_ctx, dn, &reps);
 	if (!W_ERROR_IS_OK(werr)) {
 		return werr;
 	}
@@ -227,6 +211,7 @@ WERROR dcesrv_drsuapi_DsReplicaUpdateRefs(struct dcesrv_call_state *dce_call, TA
 	struct drsuapi_DsReplicaUpdateRefsRequest1 *req;
 	struct ldb_context *sam_ctx;
 	WERROR werr;
+	struct ldb_dn *dn;
 
 	if (r->in.level != 1) {
 		DEBUG(0,("DrReplicUpdateRefs - unsupported level %u\n", r->in.level));
@@ -246,13 +231,20 @@ WERROR dcesrv_drsuapi_DsReplicaUpdateRefs(struct dcesrv_call_state *dce_call, TA
 		return WERR_DS_DRA_INTERNAL_ERROR;		
 	}
 
+	dn = ldb_dn_new(mem_ctx, sam_ctx, req->naming_context->dn);
+	if (dn == NULL) {
+		talloc_free(sam_ctx);		
+		return WERR_DS_INVALID_DN_SYNTAX;
+	}
+
 	if (ldb_transaction_start(sam_ctx) != LDB_SUCCESS) {
 		DEBUG(0,(__location__ ": Failed to start transaction on samdb\n"));
+		talloc_free(sam_ctx);
 		return WERR_DS_DRA_INTERNAL_ERROR;		
 	}
 
 	if (req->options & DRSUAPI_DS_REPLICA_UPDATE_DELETE_REFERENCE) {
-		werr = uref_del_dest(sam_ctx, mem_ctx, &req->naming_context->guid, &req->dest_dsa_guid);
+		werr = uref_del_dest(sam_ctx, mem_ctx, dn, &req->dest_dsa_guid);
 		if (!W_ERROR_IS_OK(werr)) {
 			DEBUG(0,("Failed to delete repsTo for %s\n",
 				 GUID_string(dce_call, &req->dest_dsa_guid)));
@@ -272,7 +264,7 @@ WERROR dcesrv_drsuapi_DsReplicaUpdateRefs(struct dcesrv_call_state *dce_call, TA
 		dest.source_dsa_obj_guid = req->dest_dsa_guid;
 		dest.replica_flags       = req->options;
 
-		werr = uref_add_dest(sam_ctx, mem_ctx, &req->naming_context->guid, &dest);
+		werr = uref_add_dest(sam_ctx, mem_ctx, dn, &dest);
 		if (!W_ERROR_IS_OK(werr)) {
 			DEBUG(0,("Failed to delete repsTo for %s\n",
 				 GUID_string(dce_call, &dest.source_dsa_obj_guid)));
@@ -293,4 +285,3 @@ failed:
 	talloc_free(sam_ctx);
 	return werr;
 }
-


-- 
Samba Shared Repository


More information about the samba-cvs mailing list