[SCM] Samba Shared Repository - branch master updated - 012a6524f7f8d2bca9e760dfe36ea8037766274a

Andrew Bartlett abartlet at samba.org
Sat Dec 20 04:21:23 GMT 2008


The branch, master has been updated
       via  012a6524f7f8d2bca9e760dfe36ea8037766274a (commit)
       via  18c095e5d86d1353eff8aea1b641968d504b6c80 (commit)
       via  6488afaafe028ad2deba03517294b577ea3b4167 (commit)
       via  dd5a4681e8bc009e16d3586471630933710dd190 (commit)
      from  fcadf47a156a9a9a9d43503c905e960f51f020eb (commit)

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


- Log -----------------------------------------------------------------
commit 012a6524f7f8d2bca9e760dfe36ea8037766274a
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Sat Dec 20 15:11:40 2008 +1100

    Treat DN+STring as a binary string for now
    
    This matches the way we work with DN+Binary.  We need this for the
    OpenLDAP backend.
    
    Andrew Bartlett

commit 18c095e5d86d1353eff8aea1b641968d504b6c80
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Sat Dec 20 12:05:48 2008 +1100

    Don't trust sscanf not to run off the end of the string
    
    The memory allocations here are wasteful, but they do nicely ensure we
    cannot walk off the end of the DATA_BLOB that might be a string, or
    might be binary and might not be NULL terminated.
    
    Andrew Bartlett

commit 6488afaafe028ad2deba03517294b577ea3b4167
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Fri Dec 19 15:24:36 2008 +1100

    Now store the GUID and SID from a DN over DRSUAPI into ldb.
    
    Until the extended DN work was compleated, there was no way to store
    the additional metadata.
    
    Andrew Bartlett

commit dd5a4681e8bc009e16d3586471630933710dd190
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Fri Dec 19 15:23:58 2008 +1100

    Fix compiler warning when parsing a SID in a data blob

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

Summary of changes:
 librpc/ndr/uuid.c                        |   49 +++++--
 source4/dsdb/repl/replicated_objects.c   |    2 +-
 source4/dsdb/schema/schema.h             |    6 +-
 source4/dsdb/schema/schema_description.c |    2 -
 source4/dsdb/schema/schema_syntax.c      |  203 +++++++++++++++++++++++------
 source4/libcli/security/dom_sid.c        |    2 +-
 6 files changed, 202 insertions(+), 62 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/ndr/uuid.c b/librpc/ndr/uuid.c
index aa24ac4..2b47246 100644
--- a/librpc/ndr/uuid.c
+++ b/librpc/ndr/uuid.c
@@ -36,6 +36,7 @@ _PUBLIC_ NTSTATUS GUID_from_data_blob(const DATA_BLOB *s, struct GUID *guid)
 	uint32_t clock_seq[2];
 	uint32_t node[6];
 	uint8_t buf16[16];
+
 	DATA_BLOB blob16 = data_blob_const(buf16, sizeof(buf16));
 	int i;
 
@@ -43,20 +44,40 @@ _PUBLIC_ NTSTATUS GUID_from_data_blob(const DATA_BLOB *s, struct GUID *guid)
 		return NT_STATUS_INVALID_PARAMETER;
 	}
 
-	if (s->length == 36 && 
-	    11 == sscanf((const char *)s->data, 
-			 "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
-			 &time_low, &time_mid, &time_hi_and_version, 
-			 &clock_seq[0], &clock_seq[1],
-			 &node[0], &node[1], &node[2], &node[3], &node[4], &node[5])) {
-	        status = NT_STATUS_OK;
-	} else if (s->length == 38
-		   && 11 == sscanf((const char *)s->data, 
-				   "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
-				   &time_low, &time_mid, &time_hi_and_version, 
-				   &clock_seq[0], &clock_seq[1],
-				   &node[0], &node[1], &node[2], &node[3], &node[4], &node[5])) {
-		status = NT_STATUS_OK;
+	if (s->length == 36) {
+		TALLOC_CTX *mem_ctx;
+		const char *string;
+
+		mem_ctx = talloc_new(NULL);
+		NT_STATUS_HAVE_NO_MEMORY(mem_ctx);
+		string = talloc_strndup(mem_ctx, (const char *)s->data, s->length);
+		NT_STATUS_HAVE_NO_MEMORY(string);
+		if (11 == sscanf(string,
+				 "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+				 &time_low, &time_mid, &time_hi_and_version, 
+				 &clock_seq[0], &clock_seq[1],
+				 &node[0], &node[1], &node[2], &node[3], &node[4], &node[5])) {
+			status = NT_STATUS_OK;
+		}
+		talloc_free(mem_ctx);
+
+	} else if (s->length == 38) {
+		TALLOC_CTX *mem_ctx;
+		const char *string;
+
+		mem_ctx = talloc_new(NULL);
+		NT_STATUS_HAVE_NO_MEMORY(mem_ctx);
+		string = talloc_strndup(mem_ctx, (const char *)s->data, s->length);
+		NT_STATUS_HAVE_NO_MEMORY(string);
+		if (11 == sscanf((const char *)s->data, 
+				 "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
+				 &time_low, &time_mid, &time_hi_and_version, 
+				 &clock_seq[0], &clock_seq[1],
+				 &node[0], &node[1], &node[2], &node[3], &node[4], &node[5])) {
+			status = NT_STATUS_OK;
+		}
+		talloc_free(mem_ctx);
+
 	} else if (s->length == 32) {
 		size_t rlen = strhex_to_str((char *)blob16.data, blob16.length,
 					    (const char *)s->data, s->length);
diff --git a/source4/dsdb/repl/replicated_objects.c b/source4/dsdb/repl/replicated_objects.c
index 9853a75..560f75d 100644
--- a/source4/dsdb/repl/replicated_objects.c
+++ b/source4/dsdb/repl/replicated_objects.c
@@ -282,7 +282,7 @@ static WERROR dsdb_convert_object(struct ldb_context *ldb,
 		status = dsdb_decrypt_attribute(gensec_skey, rid, a);
 		W_ERROR_NOT_OK_RETURN(status);
 
-		status = dsdb_attribute_drsuapi_to_ldb(schema, a, msg->elements, e);
+		status = dsdb_attribute_drsuapi_to_ldb(ldb, schema, a, msg->elements, e);
 		W_ERROR_NOT_OK_RETURN(status);
 
 		m->attid			= a->attid;
diff --git a/source4/dsdb/schema/schema.h b/source4/dsdb/schema/schema.h
index e8fefb5..f7d59a7 100644
--- a/source4/dsdb/schema/schema.h
+++ b/source4/dsdb/schema/schema.h
@@ -37,12 +37,14 @@ struct dsdb_syntax {
 	const char *comment;
 	const char *ldb_syntax;
 
-	WERROR (*drsuapi_to_ldb)(const struct dsdb_schema *schema,
+	WERROR (*drsuapi_to_ldb)(struct ldb_context *ldb, 
+				 const struct dsdb_schema *schema,
 				 const struct dsdb_attribute *attr,
 				 const struct drsuapi_DsReplicaAttribute *in,
 				 TALLOC_CTX *mem_ctx,
 				 struct ldb_message_element *out);
-	WERROR (*ldb_to_drsuapi)(const struct dsdb_schema *schema,
+	WERROR (*ldb_to_drsuapi)(struct ldb_context *ldb, 
+				 const struct dsdb_schema *schema,
 				 const struct dsdb_attribute *attr,
 				 const struct ldb_message_element *in,
 				 TALLOC_CTX *mem_ctx,
diff --git a/source4/dsdb/schema/schema_description.c b/source4/dsdb/schema/schema_description.c
index 9443c04..5474eb5 100644
--- a/source4/dsdb/schema/schema_description.c
+++ b/source4/dsdb/schema/schema_description.c
@@ -387,8 +387,6 @@ char *schema_class_to_dITContentRule(TALLOC_CTX *mem_ctx, const struct dsdb_clas
 char *schema_class_to_extendedInfo(TALLOC_CTX *mem_ctx, const struct dsdb_class *sclass)
 {
 	char *schema_description = NULL;
-	DATA_BLOB guid_blob;
-	char *guid_hex;
 	TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
 	if (!tmp_ctx) {
 		return NULL;
diff --git a/source4/dsdb/schema/schema_syntax.c b/source4/dsdb/schema/schema_syntax.c
index 7aed086..4141026 100644
--- a/source4/dsdb/schema/schema_syntax.c
+++ b/source4/dsdb/schema/schema_syntax.c
@@ -23,12 +23,16 @@
 #include "includes.h"
 #include "dsdb/samdb/samdb.h"
 #include "librpc/gen_ndr/ndr_drsuapi.h"
+#include "librpc/gen_ndr/ndr_security.h"
+#include "librpc/gen_ndr/ndr_misc.h"
 #include "lib/ldb/include/ldb.h"
+#include "lib/ldb/include/ldb_errors.h"
 #include "system/time.h"
 #include "../lib/util/charset/charset.h"
 #include "librpc/ndr/libndr.h"
 
-static WERROR dsdb_syntax_FOOBAR_drsuapi_to_ldb(const struct dsdb_schema *schema,
+static WERROR dsdb_syntax_FOOBAR_drsuapi_to_ldb(struct ldb_context *ldb, 
+						const struct dsdb_schema *schema,
 						const struct dsdb_attribute *attr,
 						const struct drsuapi_DsReplicaAttribute *in,
 						TALLOC_CTX *mem_ctx,
@@ -61,7 +65,8 @@ static WERROR dsdb_syntax_FOOBAR_drsuapi_to_ldb(const struct dsdb_schema *schema
 	return WERR_OK;
 }
 
-static WERROR dsdb_syntax_FOOBAR_ldb_to_drsuapi(const struct dsdb_schema *schema,
+static WERROR dsdb_syntax_FOOBAR_ldb_to_drsuapi(struct ldb_context *ldb, 
+						const struct dsdb_schema *schema,
 						const struct dsdb_attribute *attr,
 						const struct ldb_message_element *in,
 						TALLOC_CTX *mem_ctx,
@@ -70,7 +75,8 @@ static WERROR dsdb_syntax_FOOBAR_ldb_to_drsuapi(const struct dsdb_schema *schema
 	return WERR_FOOBAR;
 }
 
-static WERROR dsdb_syntax_BOOL_drsuapi_to_ldb(const struct dsdb_schema *schema,
+static WERROR dsdb_syntax_BOOL_drsuapi_to_ldb(struct ldb_context *ldb, 
+					      const struct dsdb_schema *schema,
 					      const struct dsdb_attribute *attr,
 					      const struct drsuapi_DsReplicaAttribute *in,
 					      TALLOC_CTX *mem_ctx,
@@ -114,7 +120,8 @@ static WERROR dsdb_syntax_BOOL_drsuapi_to_ldb(const struct dsdb_schema *schema,
 	return WERR_OK;
 }
 
-static WERROR dsdb_syntax_BOOL_ldb_to_drsuapi(const struct dsdb_schema *schema,
+static WERROR dsdb_syntax_BOOL_ldb_to_drsuapi(struct ldb_context *ldb, 
+					      const struct dsdb_schema *schema,
 					      const struct dsdb_attribute *attr,
 					      const struct ldb_message_element *in,
 					      TALLOC_CTX *mem_ctx,
@@ -155,7 +162,8 @@ static WERROR dsdb_syntax_BOOL_ldb_to_drsuapi(const struct dsdb_schema *schema,
 	return WERR_OK;
 }
 
-static WERROR dsdb_syntax_INT32_drsuapi_to_ldb(const struct dsdb_schema *schema,
+static WERROR dsdb_syntax_INT32_drsuapi_to_ldb(struct ldb_context *ldb, 
+					       const struct dsdb_schema *schema,
 					       const struct dsdb_attribute *attr,
 					       const struct drsuapi_DsReplicaAttribute *in,
 					       TALLOC_CTX *mem_ctx,
@@ -194,7 +202,8 @@ static WERROR dsdb_syntax_INT32_drsuapi_to_ldb(const struct dsdb_schema *schema,
 	return WERR_OK;
 }
 
-static WERROR dsdb_syntax_INT32_ldb_to_drsuapi(const struct dsdb_schema *schema,
+static WERROR dsdb_syntax_INT32_ldb_to_drsuapi(struct ldb_context *ldb, 
+					       const struct dsdb_schema *schema,
 					       const struct dsdb_attribute *attr,
 					       const struct ldb_message_element *in,
 					       TALLOC_CTX *mem_ctx,
@@ -233,7 +242,8 @@ static WERROR dsdb_syntax_INT32_ldb_to_drsuapi(const struct dsdb_schema *schema,
 	return WERR_OK;
 }
 
-static WERROR dsdb_syntax_INT64_drsuapi_to_ldb(const struct dsdb_schema *schema,
+static WERROR dsdb_syntax_INT64_drsuapi_to_ldb(struct ldb_context *ldb, 
+					       const struct dsdb_schema *schema,
 					       const struct dsdb_attribute *attr,
 					       const struct drsuapi_DsReplicaAttribute *in,
 					       TALLOC_CTX *mem_ctx,
@@ -272,7 +282,8 @@ static WERROR dsdb_syntax_INT64_drsuapi_to_ldb(const struct dsdb_schema *schema,
 	return WERR_OK;
 }
 
-static WERROR dsdb_syntax_INT64_ldb_to_drsuapi(const struct dsdb_schema *schema,
+static WERROR dsdb_syntax_INT64_ldb_to_drsuapi(struct ldb_context *ldb, 
+					       const struct dsdb_schema *schema,
 					       const struct dsdb_attribute *attr,
 					       const struct ldb_message_element *in,
 					       TALLOC_CTX *mem_ctx,
@@ -311,7 +322,8 @@ static WERROR dsdb_syntax_INT64_ldb_to_drsuapi(const struct dsdb_schema *schema,
 	return WERR_OK;
 }
 
-static WERROR dsdb_syntax_NTTIME_UTC_drsuapi_to_ldb(const struct dsdb_schema *schema,
+static WERROR dsdb_syntax_NTTIME_UTC_drsuapi_to_ldb(struct ldb_context *ldb, 
+						    const struct dsdb_schema *schema,
 						    const struct dsdb_attribute *attr,
 						    const struct drsuapi_DsReplicaAttribute *in,
 						    TALLOC_CTX *mem_ctx,
@@ -361,7 +373,8 @@ static WERROR dsdb_syntax_NTTIME_UTC_drsuapi_to_ldb(const struct dsdb_schema *sc
 	return WERR_OK;
 }
 
-static WERROR dsdb_syntax_NTTIME_UTC_ldb_to_drsuapi(const struct dsdb_schema *schema,
+static WERROR dsdb_syntax_NTTIME_UTC_ldb_to_drsuapi(struct ldb_context *ldb, 
+						    const struct dsdb_schema *schema,
 						    const struct dsdb_attribute *attr,
 						    const struct ldb_message_element *in,
 						    TALLOC_CTX *mem_ctx,
@@ -403,7 +416,8 @@ static WERROR dsdb_syntax_NTTIME_UTC_ldb_to_drsuapi(const struct dsdb_schema *sc
 	return WERR_OK;
 }
 
-static WERROR dsdb_syntax_NTTIME_drsuapi_to_ldb(const struct dsdb_schema *schema,
+static WERROR dsdb_syntax_NTTIME_drsuapi_to_ldb(struct ldb_context *ldb, 
+						const struct dsdb_schema *schema,
 						const struct dsdb_attribute *attr,
 						const struct drsuapi_DsReplicaAttribute *in,
 						TALLOC_CTX *mem_ctx,
@@ -445,7 +459,8 @@ static WERROR dsdb_syntax_NTTIME_drsuapi_to_ldb(const struct dsdb_schema *schema
 	return WERR_OK;
 }
 
-static WERROR dsdb_syntax_NTTIME_ldb_to_drsuapi(const struct dsdb_schema *schema,
+static WERROR dsdb_syntax_NTTIME_ldb_to_drsuapi(struct ldb_context *ldb, 
+						const struct dsdb_schema *schema,
 						const struct dsdb_attribute *attr,
 						const struct ldb_message_element *in,
 						TALLOC_CTX *mem_ctx,
@@ -487,7 +502,8 @@ static WERROR dsdb_syntax_NTTIME_ldb_to_drsuapi(const struct dsdb_schema *schema
 	return WERR_OK;
 }
 
-static WERROR dsdb_syntax_DATA_BLOB_drsuapi_to_ldb(const struct dsdb_schema *schema,
+static WERROR dsdb_syntax_DATA_BLOB_drsuapi_to_ldb(struct ldb_context *ldb, 
+						   const struct dsdb_schema *schema,
 						   const struct dsdb_attribute *attr,
 						   const struct drsuapi_DsReplicaAttribute *in,
 						   TALLOC_CTX *mem_ctx,
@@ -520,7 +536,8 @@ static WERROR dsdb_syntax_DATA_BLOB_drsuapi_to_ldb(const struct dsdb_schema *sch
 	return WERR_OK;
 }
 
-static WERROR dsdb_syntax_DATA_BLOB_ldb_to_drsuapi(const struct dsdb_schema *schema,
+static WERROR dsdb_syntax_DATA_BLOB_ldb_to_drsuapi(struct ldb_context *ldb, 
+						   const struct dsdb_schema *schema,
 						   const struct dsdb_attribute *attr,
 						   const struct ldb_message_element *in,
 						   TALLOC_CTX *mem_ctx,
@@ -553,7 +570,8 @@ static WERROR dsdb_syntax_DATA_BLOB_ldb_to_drsuapi(const struct dsdb_schema *sch
 	return WERR_OK;
 }
 
-static WERROR _dsdb_syntax_OID_obj_drsuapi_to_ldb(const struct dsdb_schema *schema,
+static WERROR _dsdb_syntax_OID_obj_drsuapi_to_ldb(struct ldb_context *ldb, 
+						  const struct dsdb_schema *schema,
 						  const struct dsdb_attribute *attr,
 						  const struct drsuapi_DsReplicaAttribute *in,
 						  TALLOC_CTX *mem_ctx,
@@ -599,7 +617,8 @@ static WERROR _dsdb_syntax_OID_obj_drsuapi_to_ldb(const struct dsdb_schema *sche
 	return WERR_OK;
 }
 
-static WERROR _dsdb_syntax_OID_oid_drsuapi_to_ldb(const struct dsdb_schema *schema,
+static WERROR _dsdb_syntax_OID_oid_drsuapi_to_ldb(struct ldb_context *ldb, 
+						  const struct dsdb_schema *schema,
 						  const struct dsdb_attribute *attr,
 						  const struct drsuapi_DsReplicaAttribute *in,
 						  TALLOC_CTX *mem_ctx,
@@ -639,7 +658,8 @@ static WERROR _dsdb_syntax_OID_oid_drsuapi_to_ldb(const struct dsdb_schema *sche
 	return WERR_OK;
 }
 
-static WERROR dsdb_syntax_OID_drsuapi_to_ldb(const struct dsdb_schema *schema,
+static WERROR dsdb_syntax_OID_drsuapi_to_ldb(struct ldb_context *ldb, 
+					     const struct dsdb_schema *schema,
 					     const struct dsdb_attribute *attr,
 					     const struct drsuapi_DsReplicaAttribute *in,
 					     TALLOC_CTX *mem_ctx,
@@ -649,11 +669,11 @@ static WERROR dsdb_syntax_OID_drsuapi_to_ldb(const struct dsdb_schema *schema,
 
 	switch (attr->attributeID_id) {
 	case DRSUAPI_ATTRIBUTE_objectClass:
-		return _dsdb_syntax_OID_obj_drsuapi_to_ldb(schema, attr, in, mem_ctx, out);
+		return _dsdb_syntax_OID_obj_drsuapi_to_ldb(ldb, schema, attr, in, mem_ctx, out);
 	case DRSUAPI_ATTRIBUTE_governsID:
 	case DRSUAPI_ATTRIBUTE_attributeID:
 	case DRSUAPI_ATTRIBUTE_attributeSyntax:
-		return _dsdb_syntax_OID_oid_drsuapi_to_ldb(schema, attr, in, mem_ctx, out);
+		return _dsdb_syntax_OID_oid_drsuapi_to_ldb(ldb, schema, attr, in, mem_ctx, out);
 	}
 
 	out->flags	= 0;
@@ -693,7 +713,8 @@ static WERROR dsdb_syntax_OID_drsuapi_to_ldb(const struct dsdb_schema *schema,
 	return WERR_OK;
 }
 
-static WERROR dsdb_syntax_OID_ldb_to_drsuapi(const struct dsdb_schema *schema,
+static WERROR dsdb_syntax_OID_ldb_to_drsuapi(struct ldb_context *ldb, 
+					     const struct dsdb_schema *schema,
 					     const struct dsdb_attribute *attr,
 					     const struct ldb_message_element *in,
 					     TALLOC_CTX *mem_ctx,
@@ -711,7 +732,7 @@ static WERROR dsdb_syntax_OID_ldb_to_drsuapi(const struct dsdb_schema *schema,
 	case DRSUAPI_ATTRIBUTE_governsID:
 	case DRSUAPI_ATTRIBUTE_attributeID:
 	case DRSUAPI_ATTRIBUTE_attributeSyntax:
-		return dsdb_syntax_FOOBAR_ldb_to_drsuapi(schema, attr, in, mem_ctx, out);
+		return dsdb_syntax_FOOBAR_ldb_to_drsuapi(ldb, schema, attr, in, mem_ctx, out);
 	}
 
 	out->attid			= attr->attributeID_id;
@@ -740,7 +761,8 @@ static WERROR dsdb_syntax_OID_ldb_to_drsuapi(const struct dsdb_schema *schema,
 	return WERR_OK;
 }
 
-static WERROR dsdb_syntax_UNICODE_drsuapi_to_ldb(const struct dsdb_schema *schema,
+static WERROR dsdb_syntax_UNICODE_drsuapi_to_ldb(struct ldb_context *ldb, 
+						 const struct dsdb_schema *schema,
 						 const struct dsdb_attribute *attr,
 						 const struct drsuapi_DsReplicaAttribute *in,
 						 TALLOC_CTX *mem_ctx,
@@ -784,7 +806,8 @@ static WERROR dsdb_syntax_UNICODE_drsuapi_to_ldb(const struct dsdb_schema *schem
 	return WERR_OK;
 }
 
-static WERROR dsdb_syntax_UNICODE_ldb_to_drsuapi(const struct dsdb_schema *schema,
+static WERROR dsdb_syntax_UNICODE_ldb_to_drsuapi(struct ldb_context *ldb, 
+						 const struct dsdb_schema *schema,
 						 const struct dsdb_attribute *attr,
 						 const struct ldb_message_element *in,
 						 TALLOC_CTX *mem_ctx,
@@ -825,13 +848,15 @@ static WERROR dsdb_syntax_UNICODE_ldb_to_drsuapi(const struct dsdb_schema *schem
 	return WERR_OK;
 }
 
-static WERROR dsdb_syntax_DN_drsuapi_to_ldb(const struct dsdb_schema *schema,
+static WERROR dsdb_syntax_DN_drsuapi_to_ldb(struct ldb_context *ldb, 
+					    const struct dsdb_schema *schema,
 					    const struct dsdb_attribute *attr,
 					    const struct drsuapi_DsReplicaAttribute *in,
 					    TALLOC_CTX *mem_ctx,
 					    struct ldb_message_element *out)
 {
 	uint32_t i;
+	int ret;
 
 	out->flags	= 0;
 	out->name	= talloc_strdup(mem_ctx, attr->lDAPDisplayName);
@@ -844,31 +869,83 @@ static WERROR dsdb_syntax_DN_drsuapi_to_ldb(const struct dsdb_schema *schema,
 	for (i=0; i < out->num_values; i++) {
 		struct drsuapi_DsReplicaObjectIdentifier3 id3;
 		enum ndr_err_code ndr_err;
+		DATA_BLOB guid_blob;
+		struct ldb_dn *dn;
+		TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
+		if (!tmp_ctx) {
+			W_ERROR_HAVE_NO_MEMORY(tmp_ctx);
+		}
 
 		if (in->value_ctr.values[i].blob == NULL) {
+			talloc_free(tmp_ctx);
 			return WERR_FOOBAR;
 		}
 
 		if (in->value_ctr.values[i].blob->length == 0) {
+			talloc_free(tmp_ctx);
 			return WERR_FOOBAR;
 		}
 
+		
+
 		ndr_err = ndr_pull_struct_blob_all(in->value_ctr.values[i].blob,
-						   out->values, schema->iconv_convenience, &id3,
+						   tmp_ctx, schema->iconv_convenience, &id3,
 						   (ndr_pull_flags_fn_t)ndr_pull_drsuapi_DsReplicaObjectIdentifier3);
 		if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
 			NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
+			talloc_free(tmp_ctx);
 			return ntstatus_to_werror(status);
 		}
 
-		/* TODO: handle id3.guid and id3.sid */
-		out->values[i] = data_blob_string_const(id3.dn);
+		dn = ldb_dn_new(tmp_ctx, ldb, id3.dn);
+		if (!dn) {
+			talloc_free(tmp_ctx);
+			/* If this fails, it must be out of memory, as it does not do much parsing */
+			W_ERROR_HAVE_NO_MEMORY(dn);
+		}
+
+		ndr_err = ndr_push_struct_blob(&guid_blob, tmp_ctx, schema->iconv_convenience, &id3.guid,
+					       (ndr_push_flags_fn_t)ndr_push_GUID);
+		if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+			NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
+			talloc_free(tmp_ctx);
+			return ntstatus_to_werror(status);
+		}
+
+		ret = ldb_dn_set_extended_component(dn, "GUID", &guid_blob);
+		if (ret != LDB_SUCCESS) {
+			talloc_free(tmp_ctx);
+			return WERR_FOOBAR;
+		}
+
+		talloc_free(guid_blob.data);
+
+		if (id3.__ndr_size_sid) {
+			DATA_BLOB sid_blob;
+			ndr_err = ndr_push_struct_blob(&sid_blob, tmp_ctx, schema->iconv_convenience, &id3.sid,
+						       (ndr_push_flags_fn_t)ndr_push_dom_sid);
+			if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+				NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
+				talloc_free(tmp_ctx);
+				return ntstatus_to_werror(status);
+			}
+
+			ret = ldb_dn_set_extended_component(dn, "SID", &sid_blob);
+			if (ret != LDB_SUCCESS) {
+				talloc_free(tmp_ctx);
+				return WERR_FOOBAR;
+			}
+		}
+
+		out->values[i] = data_blob_string_const(ldb_dn_get_extended_linearized(out->values, dn, 1));
+		talloc_free(tmp_ctx);
 	}
 
 	return WERR_OK;
 }
 
-static WERROR dsdb_syntax_DN_ldb_to_drsuapi(const struct dsdb_schema *schema,
+static WERROR dsdb_syntax_DN_ldb_to_drsuapi(struct ldb_context *ldb, 
+					    const struct dsdb_schema *schema,
 					    const struct dsdb_attribute *attr,
 					    const struct ldb_message_element *in,
 					    TALLOC_CTX *mem_ctx,
@@ -894,24 +971,61 @@ static WERROR dsdb_syntax_DN_ldb_to_drsuapi(const struct dsdb_schema *schema,
 	for (i=0; i < in->num_values; i++) {
 		struct drsuapi_DsReplicaObjectIdentifier3 id3;
 		enum ndr_err_code ndr_err;
+		const DATA_BLOB *guid_blob, *sid_blob;
+		struct ldb_dn *dn;
+		TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
+		W_ERROR_HAVE_NO_MEMORY(tmp_ctx);
 
 		out->value_ctr.values[i].blob	= &blobs[i];
 
-		/* TODO: handle id3.guid and id3.sid */
+		dn = ldb_dn_from_ldb_val(tmp_ctx, ldb, &in->values[i]);
+
+		W_ERROR_HAVE_NO_MEMORY(dn);
+
+		guid_blob = ldb_dn_get_extended_component(dn, "GUID");
+
 		ZERO_STRUCT(id3);
-		id3.dn = (const char *)in->values[i].data;
+
+		if (guid_blob) {
+			ndr_err = ndr_pull_struct_blob_all(guid_blob, 
+							   tmp_ctx, schema->iconv_convenience, &id3.guid,
+							   (ndr_pull_flags_fn_t)ndr_pull_GUID);
+			if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+				NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
+				talloc_free(tmp_ctx);
+				return ntstatus_to_werror(status);
+			}
+		}
+
+		sid_blob = ldb_dn_get_extended_component(dn, "SID");
+		if (sid_blob) {
+			
+			ndr_err = ndr_pull_struct_blob_all(sid_blob, 
+							   tmp_ctx, schema->iconv_convenience, &id3.sid,
+							   (ndr_pull_flags_fn_t)ndr_pull_dom_sid);
+			if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+				NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
+				talloc_free(tmp_ctx);
+				return ntstatus_to_werror(status);
+			}
+		}
+
+		id3.dn = ldb_dn_get_linearized(dn);


-- 
Samba Shared Repository


More information about the samba-cvs mailing list