[SCM] Samba Shared Repository - branch master updated - tevent-0-9-8-689-g42c3eca

Andrew Tridgell tridge at samba.org
Thu Sep 24 11:53:21 MDT 2009


The branch, master has been updated
       via  42c3eca0d5ccbe116d7b101bc9adaa3b39ca5da2 (commit)
       via  2deea285203e154173ad43ad61187cb73e8b25b3 (commit)
       via  547a6da58e4de2e87ac55c62001cfee8e806b323 (commit)
       via  3b7c668606c63d85eeb7f61920e8f40074d7829f (commit)
       via  41e409370b1c8c8572ead30d7f79bfd2dd6f4118 (commit)
       via  f8a09e8fb32e23deb59a62f1e110724bb39b0508 (commit)
       via  baf93360a869a55617e1b29f2d954320967f8f71 (commit)
       via  1fa735cc86cc4f05a6e53bf0ef17bd8562a94d00 (commit)
       via  a9188f7e10dffc9ad7c30b0b51a45d21b633417d (commit)
       via  3cd0f9e264b0ebb92d5fe8086ee2d146f3e3d02d (commit)
      from  96dd5719d4295654f7e45ac653e66192dc4ca3c5 (commit)

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


- Log -----------------------------------------------------------------
commit 42c3eca0d5ccbe116d7b101bc9adaa3b39ca5da2
Author: Andrew Tridgell <tridge at samba.org>
Date:   Thu Sep 24 07:08:31 2009 -0700

    s4-drs: el may not be a talloc pointer
    
    Use msg->elements for the new element values

commit 2deea285203e154173ad43ad61187cb73e8b25b3
Author: Andrew Tridgell <tridge at samba.org>
Date:   Thu Sep 24 07:19:46 2009 -0700

    s4-drs: regenerate IDL after ndr size change

commit 547a6da58e4de2e87ac55c62001cfee8e806b323
Author: Andrew Tridgell <tridge at samba.org>
Date:   Thu Sep 24 07:19:01 2009 -0700

    s4-drs: add defines for replication flags on attributes

commit 3b7c668606c63d85eeb7f61920e8f40074d7829f
Author: Andrew Tridgell <tridge at samba.org>
Date:   Thu Sep 24 07:18:21 2009 -0700

    s4-ldb: sort replPropertyMetaData by attid
    
    We need to sort on both module add and modify

commit 41e409370b1c8c8572ead30d7f79bfd2dd6f4118
Author: Andrew Tridgell <tridge at samba.org>
Date:   Thu Sep 24 07:16:50 2009 -0700

    s4-ldb: add instanceType in repl_meta_data module
    
    We need to add instanceType on new records if not added by caller. This is needed in repl_meta_data
    to ensure we fill in the meta data for replication

commit f8a09e8fb32e23deb59a62f1e110724bb39b0508
Author: Andrew Tridgell <tridge at samba.org>
Date:   Thu Sep 24 07:02:47 2009 -0700

    s4-drs: fixed the size of DN binary blobs on the wire
    
    Comparison with w2k8 traces shows the size field of
    drsuapi_DsReplicaObjectIdentifier3Binary is taken from
    drsuapi_DsReplicaObjectIdentifier3
    
    Thanks to metze for spotting this

commit baf93360a869a55617e1b29f2d954320967f8f71
Author: Andrew Tridgell <tridge at samba.org>
Date:   Thu Sep 24 07:12:14 2009 -0700

    s4-drs: include deleted objects in getncchanges reply
    
    Even though we don't create deleted objects ourselves yet, we need to
    pass along deleted objects we receive from other replication partners

commit 1fa735cc86cc4f05a6e53bf0ef17bd8562a94d00
Author: Andrew Tridgell <tridge at samba.org>
Date:   Thu Sep 24 07:05:07 2009 -0700

    s4-drs: add SHOW_DELETED control on dsdb utility calls
    
    The dsdb_find_dn_by_guid() and dsdb_find_sid_by_dn() are using by
    the DRS server call getncchanges on objects that may be deleted.

commit a9188f7e10dffc9ad7c30b0b51a45d21b633417d
Author: Andrew Tridgell <tridge at samba.org>
Date:   Wed Sep 23 14:53:28 2009 -0700

    s4-libnet: allow the functional level of becomeDC to be specified
    
    Use
       ads:functional level = 4
    for DS_DC_FUNCTION_2008_R2
    
    See libds/common/flags.h

commit 3cd0f9e264b0ebb92d5fe8086ee2d146f3e3d02d
Author: Andrew Tridgell <tridge at samba.org>
Date:   Thu Sep 24 10:33:36 2009 -0700

    s4-libnet: avoid a steal with references error

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

Summary of changes:
 libds/common/flags.h                            |    3 +
 librpc/gen_ndr/drsuapi.h                        |    2 +-
 librpc/gen_ndr/ndr_drsuapi.c                    |    4 +-
 librpc/idl/drsuapi.idl                          |    2 +-
 source4/dsdb/common/util.c                      |   62 ++++++++++++++++++++++-
 source4/dsdb/samdb/ldb_modules/repl_meta_data.c |   32 ++++++++++--
 source4/libnet/libnet_become_dc.c               |    3 +-
 source4/libnet/libnet_vampire.c                 |    3 +-
 source4/rpc_server/drsuapi/addentry.c           |    2 +-
 source4/rpc_server/drsuapi/drsutil.c            |    7 ++-
 10 files changed, 104 insertions(+), 16 deletions(-)


Changeset truncated at 500 lines:

diff --git a/libds/common/flags.h b/libds/common/flags.h
index dfdd603..fb90e66 100644
--- a/libds/common/flags.h
+++ b/libds/common/flags.h
@@ -180,3 +180,6 @@
 #define DS_DC_FUNCTION_2008		3
 #define DS_DC_FUNCTION_2008_R2		4
 
+/* sa->systemFlags on attributes */
+#define DS_FLAG_ATTR_NOT_REPLICATED    0x00000001
+#define DS_FLAG_ATTR_IS_CONSTRUCTED    0x00000004
diff --git a/librpc/gen_ndr/drsuapi.h b/librpc/gen_ndr/drsuapi.h
index 3562123..52b6ee9 100644
--- a/librpc/gen_ndr/drsuapi.h
+++ b/librpc/gen_ndr/drsuapi.h
@@ -517,7 +517,7 @@ struct drsuapi_DsReplicaObjectIdentifier3 {
 }/* [gensize,public] */;
 
 struct drsuapi_DsReplicaObjectIdentifier3Binary {
-	uint32_t __ndr_size;/* [value(ndr_size_drsuapi_DsReplicaObjectIdentifier3Binary(r,ndr->iconv_convenience,ndr->flags))] */
+	uint32_t __ndr_size;/* [value(ndr_size_drsuapi_DsReplicaObjectIdentifier3(r,ndr->iconv_convenience,ndr->flags))] */
 	uint32_t __ndr_size_sid;/* [value(ndr_size_dom_sid28(&sid,ndr->flags))] */
 	struct GUID guid;
 	struct dom_sid28 sid;
diff --git a/librpc/gen_ndr/ndr_drsuapi.c b/librpc/gen_ndr/ndr_drsuapi.c
index 9d65b2e..a09566c 100644
--- a/librpc/gen_ndr/ndr_drsuapi.c
+++ b/librpc/gen_ndr/ndr_drsuapi.c
@@ -2128,7 +2128,7 @@ _PUBLIC_ enum ndr_err_code ndr_push_drsuapi_DsReplicaObjectIdentifier3Binary(str
 {
 	if (ndr_flags & NDR_SCALARS) {
 		NDR_CHECK(ndr_push_align(ndr, 4));
-		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_size_drsuapi_DsReplicaObjectIdentifier3Binary(r, ndr->iconv_convenience, ndr->flags)));
+		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_size_drsuapi_DsReplicaObjectIdentifier3(r, ndr->iconv_convenience, ndr->flags)));
 		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_size_dom_sid28(&r->sid, ndr->flags)));
 		NDR_CHECK(ndr_push_GUID(ndr, NDR_SCALARS, &r->guid));
 		NDR_CHECK(ndr_push_dom_sid28(ndr, NDR_SCALARS, &r->sid));
@@ -2176,7 +2176,7 @@ _PUBLIC_ void ndr_print_drsuapi_DsReplicaObjectIdentifier3Binary(struct ndr_prin
 {
 	ndr_print_struct(ndr, name, "drsuapi_DsReplicaObjectIdentifier3Binary");
 	ndr->depth++;
-	ndr_print_uint32(ndr, "__ndr_size", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?ndr_size_drsuapi_DsReplicaObjectIdentifier3Binary(r, ndr->iconv_convenience, ndr->flags):r->__ndr_size);
+	ndr_print_uint32(ndr, "__ndr_size", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?ndr_size_drsuapi_DsReplicaObjectIdentifier3(r, ndr->iconv_convenience, ndr->flags):r->__ndr_size);
 	ndr_print_uint32(ndr, "__ndr_size_sid", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?ndr_size_dom_sid28(&r->sid, ndr->flags):r->__ndr_size_sid);
 	ndr_print_GUID(ndr, "guid", &r->guid);
 	ndr_print_dom_sid28(ndr, "sid", &r->sid);
diff --git a/librpc/idl/drsuapi.idl b/librpc/idl/drsuapi.idl
index 27d3089..9d2d153 100644
--- a/librpc/idl/drsuapi.idl
+++ b/librpc/idl/drsuapi.idl
@@ -553,7 +553,7 @@ interface drsuapi
 	} drsuapi_DsReplicaObjectIdentifier3;
 
 	typedef [public,gensize] struct {
-		[value(ndr_size_drsuapi_DsReplicaObjectIdentifier3Binary(r, ndr->iconv_convenience, ndr->flags))] uint32 __ndr_size;
+		[value(ndr_size_drsuapi_DsReplicaObjectIdentifier3(r, ndr->iconv_convenience, ndr->flags))] uint32 __ndr_size;
 		[value(ndr_size_dom_sid28(&sid,ndr->flags))]  uint32 __ndr_size_sid;
 		GUID guid;
 		dom_sid28 sid;
diff --git a/source4/dsdb/common/util.c b/source4/dsdb/common/util.c
index 9a49417..52ba40b 100644
--- a/source4/dsdb/common/util.c
+++ b/source4/dsdb/common/util.c
@@ -2184,6 +2184,56 @@ int dsdb_find_dn_by_guid(struct ldb_context *ldb,
 	return LDB_SUCCESS;
 }
 
+/*
+  search for attrs on one DN, allowing for deleted objects
+ */
+static int dsdb_search_dn_with_deleted(struct ldb_context *ldb,
+				       TALLOC_CTX *mem_ctx,
+				       struct ldb_result **_res,
+				       struct ldb_dn *basedn,
+				       const char * const *attrs)
+{
+	int ret;
+	struct ldb_request *req;
+	TALLOC_CTX *tmp_ctx;
+	struct ldb_result *res;
+
+	tmp_ctx = talloc_new(mem_ctx);
+
+	res = talloc_zero(tmp_ctx, struct ldb_result);
+	if (!res) {
+		return LDB_ERR_OPERATIONS_ERROR;
+	}
+
+	ret = ldb_build_search_req(&req, ldb, tmp_ctx,
+				   basedn,
+				   LDB_SCOPE_BASE,
+				   NULL,
+				   attrs,
+				   NULL,
+				   res,
+				   ldb_search_default_callback,
+				   NULL);
+	if (ret != LDB_SUCCESS) {
+		talloc_free(tmp_ctx);
+		return ret;
+	}
+
+	ret = ldb_request_add_control(req, LDB_CONTROL_SHOW_DELETED_OID, true, NULL);
+	if (ret != LDB_SUCCESS) {
+		return ret;
+	}
+
+	ret = ldb_request(ldb, req);
+	if (ret == LDB_SUCCESS) {
+		ret = ldb_wait(req->handle, LDB_WAIT_ALL);
+	}
+
+	talloc_free(req);
+	*_res = talloc_steal(mem_ctx, res);
+	return ret;
+}
+
 
 /*
   use a DN to find a GUID
@@ -2196,11 +2246,15 @@ int dsdb_find_guid_by_dn(struct ldb_context *ldb,
 	const char *attrs[] = { "objectGUID", NULL };
 	TALLOC_CTX *tmp_ctx = talloc_new(ldb);
 
-	ret = ldb_search(ldb, tmp_ctx, &res, dn, LDB_SCOPE_BASE, attrs, NULL);
+	ret = dsdb_search_dn_with_deleted(ldb, tmp_ctx, &res, dn, attrs);
 	if (ret != LDB_SUCCESS) {
 		talloc_free(tmp_ctx);
 		return ret;
 	}
+	if (res->count < 1) {
+		talloc_free(tmp_ctx);
+		return LDB_ERR_NO_SUCH_OBJECT;
+	}
 	*guid = samdb_result_guid(res->msgs[0], "objectGUID");
 	talloc_free(tmp_ctx);
 	return LDB_SUCCESS;
@@ -2220,11 +2274,15 @@ int dsdb_find_sid_by_dn(struct ldb_context *ldb,
 
 	ZERO_STRUCTP(sid);
 
-	ret = ldb_search(ldb, tmp_ctx, &res, dn, LDB_SCOPE_BASE, attrs, NULL);
+	ret = dsdb_search_dn_with_deleted(ldb, tmp_ctx, &res, dn, attrs);
 	if (ret != LDB_SUCCESS) {
 		talloc_free(tmp_ctx);
 		return ret;
 	}
+	if (res->count < 1) {
+		talloc_free(tmp_ctx);
+		return LDB_ERR_NO_SUCH_OBJECT;
+	}
 	s = samdb_result_dom_sid(tmp_ctx, res->msgs[0], "objectSID");
 	if (s == NULL) {
 		talloc_free(tmp_ctx);
diff --git a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
index bb1c5bb..f07dc14 100644
--- a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
+++ b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
@@ -523,6 +523,14 @@ static int replmd_add(struct ldb_module *module, struct ldb_request *req)
 	ldb_msg_remove_attr(msg, "uSNChanged");
 	ldb_msg_remove_attr(msg, "replPropertyMetaData");
 
+	if (!ldb_msg_find_element(req->op.add.message, "instanceType")) {
+		ret = ldb_msg_add_fmt(msg, "instanceType", "%u", INSTANCE_TYPE_WRITE);
+		if (ret != LDB_SUCCESS) {
+			ldb_oom(ldb);
+			return LDB_ERR_OPERATIONS_ERROR;
+		}
+	}
+
 	/*
 	 * readd replicated attributes
 	 */
@@ -559,7 +567,7 @@ static int replmd_add(struct ldb_module *module, struct ldb_request *req)
 			return LDB_ERR_NO_SUCH_ATTRIBUTE;
 		}
 
-		if ((sa->systemFlags & 0x00000001) || (sa->systemFlags & 0x00000004)) {
+		if ((sa->systemFlags & DS_FLAG_ATTR_NOT_REPLICATED) || (sa->systemFlags & DS_FLAG_ATTR_IS_CONSTRUCTED)) {
 			/* if the attribute is not replicated (0x00000001)
 			 * or constructed (0x00000004) it has no metadata
 			 */
@@ -681,10 +689,7 @@ static int replmd_update_rpmd_element(struct ldb_context *ldb,
 		return LDB_ERR_OPERATIONS_ERROR;
 	}
 
-	if ((a->systemFlags & 0x00000001) || (a->systemFlags & 0x00000004)) {
-		/* if the attribute is not replicated (0x00000001)
-		 * or constructed (0x00000004) it has no metadata
-		 */
+	if ((a->systemFlags & DS_FLAG_ATTR_NOT_REPLICATED) || (a->systemFlags & DS_FLAG_ATTR_IS_CONSTRUCTED)) {
 		return LDB_SUCCESS;
 	}
 
@@ -806,6 +811,20 @@ static int replmd_update_rpmd(struct ldb_module *module,
 	if (*seq_num != 0) {
 		struct ldb_val *md_value;
 		struct ldb_message_element *el;
+		const char *rdn_name;
+		const struct dsdb_attribute *rdn_sa;
+
+		rdn_name = ldb_dn_get_rdn_name(msg->dn);
+		if (!rdn_name) {
+			DEBUG(0,(__location__ ": No rDN for %s?\n", ldb_dn_get_linearized(msg->dn)));
+			return LDB_ERR_OPERATIONS_ERROR;
+		}
+		rdn_sa = dsdb_attribute_by_lDAPDisplayName(schema, rdn_name);
+		if (rdn_sa == NULL) {
+			DEBUG(0,(__location__ ": sa not found for rDN %s in %s?\n", 
+				 rdn_name, ldb_dn_get_linearized(msg->dn)));
+			return LDB_ERR_OPERATIONS_ERROR;
+		}
 
 		md_value = talloc(msg, struct ldb_val);
 		if (md_value == NULL) {
@@ -813,6 +832,8 @@ static int replmd_update_rpmd(struct ldb_module *module,
 			return LDB_ERR_OPERATIONS_ERROR;
 		}
 
+		replmd_replPropertyMetaDataCtr1_sort(&omd.ctr.ctr1, &rdn_sa->attributeID_id);
+
 		ndr_err = ndr_push_struct_blob(md_value, msg, 
 					       lp_iconv_convenience(ldb_get_opaque(ldb, "loadparm")),
 					       &omd,
@@ -902,7 +923,6 @@ static int replmd_modify(struct ldb_module *module, struct ldb_request *req)
 	}
 
 	/* TODO:
-	 * - sort the attributes by attid with replmd_ldb_message_sort()
 	 * - replace the old object with the newly constructed one
 	 */
 
diff --git a/source4/libnet/libnet_become_dc.c b/source4/libnet/libnet_become_dc.c
index 70dee95..38357ef 100644
--- a/source4/libnet/libnet_become_dc.c
+++ b/source4/libnet/libnet_become_dc.c
@@ -2101,7 +2101,8 @@ static void becomeDC_drsuapi1_add_entry_send(struct libnet_BecomeDC_state *s)
 		vd[0] = data_blob_talloc(vd, NULL, 4);
 		if (composite_nomem(vd[0].data, c)) return;
 
-		SIVAL(vd[0].data, 0, DS_DC_FUNCTION_2008);
+		SIVAL(vd[0].data, 0, 
+		      lp_parm_int(s->libnet->lp_ctx, NULL, "ads", "functional level", DS_DC_FUNCTION_2008));
 
 		vs[0].blob		= &vd[0];
 
diff --git a/source4/libnet/libnet_vampire.c b/source4/libnet/libnet_vampire.c
index 19453a4..c8161e1 100644
--- a/source4/libnet/libnet_vampire.c
+++ b/source4/libnet/libnet_vampire.c
@@ -38,6 +38,7 @@
 #include "auth/auth.h"
 #include "param/param.h"
 #include "param/provision.h"
+#include "libcli/security/dom_sid.h"
 
 /* 
 List of tasks vampire.py must perform:
@@ -744,7 +745,7 @@ NTSTATUS libnet_Vampire(struct libnet_context *ctx, TALLOC_CTX *mem_ctx,
 	}
 
 	r->out.domain_name = talloc_steal(r, join->out.domain_name);
-	r->out.domain_sid = talloc_steal(r, join->out.domain_sid);
+	r->out.domain_sid = dom_sid_dup(r, join->out.domain_sid);
 	
 	/* commit the transaction now we know the secrets were written
 	 * out properly
diff --git a/source4/rpc_server/drsuapi/addentry.c b/source4/rpc_server/drsuapi/addentry.c
index c7c9582..7bf8f39 100644
--- a/source4/rpc_server/drsuapi/addentry.c
+++ b/source4/rpc_server/drsuapi/addentry.c
@@ -101,7 +101,7 @@ static WERROR drsuapi_add_SPNs(struct drsuapi_bind_state *b_state,
 		}
 
 		el->num_values = 2;
-		el->values = talloc_array(el, struct ldb_val, 2);
+		el->values = talloc_array(msg->elements, struct ldb_val, 2);
 		if (el->values == NULL) {
 			return WERR_NOMEM;
 		}
diff --git a/source4/rpc_server/drsuapi/drsutil.c b/source4/rpc_server/drsuapi/drsutil.c
index 9aef317..410563c 100644
--- a/source4/rpc_server/drsuapi/drsutil.c
+++ b/source4/rpc_server/drsuapi/drsutil.c
@@ -88,6 +88,11 @@ int drsuapi_search_with_extended_dn(struct ldb_context *ldb,
 		return ret;
 	}
 
+	ret = ldb_request_add_control(req, LDB_CONTROL_SHOW_DELETED_OID, true, NULL);
+	if (ret != LDB_SUCCESS) {
+		return ret;
+	}
+
 	if (sort_attrib) {
 		struct ldb_server_sort_control **sort_control;
 		sort_control = talloc_array(req, struct ldb_server_sort_control *, 2);
@@ -114,7 +119,7 @@ int drsuapi_search_with_extended_dn(struct ldb_context *ldb,
 	}
 
 	talloc_free(req);
-	*_res = res;
+	*_res = talloc_steal(mem_ctx, res);
 	return ret;
 }
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list