[SCM] Samba Shared Repository - branch master updated

Stefan Metzmacher metze at samba.org
Mon Feb 1 09:17:41 MST 2010


The branch, master has been updated
       via  93142e4... s4/ldif: Handle Schema:prefixMap blobs in W2K3 and W2K8
       via  83068b4... s4/ldif: Better control on ldif_write_NDR() errors processing
       via  a342e3a... s4/idl: drsblobs IDL regeneration
       via  20db321... s4/drsblobs: Custom ndr_print_ implementation for drsuapi_MSPrefixMap_Entry
       via  cd3d165... s4/idl: PrefixMap description for W2K3 and W2K8 Schema:prefixMap attribute
      from  5310596... tdb: fix an early release of the global lock that can cause data corruption

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


- Log -----------------------------------------------------------------
commit 93142e4a3a0a7dbe5f8ba737bd45f01c61d997da
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Wed Jan 20 18:10:05 2010 +0200

    s4/ldif: Handle Schema:prefixMap blobs in W2K3 and W2K8
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 83068b42ae22af18c5a06dc05a86021db0e25634
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Wed Jan 20 17:58:39 2010 +0200

    s4/ldif: Better control on ldif_write_NDR() errors processing
    
    Current implementation mask NDR_ errors implicitly.
    Thus the caller has no opportunity handle such an error.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit a342e3a419058e28f073a6c5b96ede15a8bdec91
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Tue Jan 19 16:54:09 2010 +0200

    s4/idl: drsblobs IDL regeneration
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit 20db3211ae406004425dd2e2b4294b03b4c4ecbf
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Tue Jan 19 16:53:32 2010 +0200

    s4/drsblobs: Custom ndr_print_ implementation for drsuapi_MSPrefixMap_Entry
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

commit cd3d165778e51987f185a58ff49c124a555e14e7
Author: Kamen Mazdrashki <kamen.mazdrashki at postpath.com>
Date:   Tue Jan 19 16:52:10 2010 +0200

    s4/idl: PrefixMap description for W2K3 and W2K8 Schema:prefixMap attribute
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>

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

Summary of changes:
 librpc/gen_ndr/drsblobs.h             |   12 ++++
 librpc/gen_ndr/ndr_drsblobs.c         |  103 +++++++++++++++++++++++++++++++++
 librpc/gen_ndr/ndr_drsblobs.h         |    5 ++
 librpc/idl/drsblobs.idl               |   22 +++++++
 librpc/ndr/ndr_drsblobs.c             |   25 ++++++++
 librpc/ndr/ndr_drsblobs.h             |    2 +-
 source4/lib/ldb-samba/ldif_handlers.c |   45 +++++++++++---
 7 files changed, 203 insertions(+), 11 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/gen_ndr/drsblobs.h b/librpc/gen_ndr/drsblobs.h
index 57712a4..7fa201d 100644
--- a/librpc/gen_ndr/drsblobs.h
+++ b/librpc/gen_ndr/drsblobs.h
@@ -134,6 +134,18 @@ struct partialAttributeSetBlob {
 	union partialAttributeSetCtr ctr;/* [switch_is(version)] */
 }/* [public] */;
 
+struct drsuapi_MSPrefixMap_Entry {
+	uint16_t entryID;
+	uint16_t length;
+	uint8_t *binary_oid;
+}/* [noprint,flag(LIBNDR_FLAG_NOALIGN)] */;
+
+struct drsuapi_MSPrefixMap_Ctr {
+	uint32_t num_entries;
+	uint32_t __ndr_size;/* [value(ndr_size_drsuapi_MSPrefixMap_Ctr(r,ndr->iconv_convenience,ndr->flags))] */
+	struct drsuapi_MSPrefixMap_Entry *entries;
+}/* [gensize,public] */;
+
 enum prefixMapVersion
 #ifndef USE_UINT_ENUMS
  {
diff --git a/librpc/gen_ndr/ndr_drsblobs.c b/librpc/gen_ndr/ndr_drsblobs.c
index 3102251..4290ce5 100644
--- a/librpc/gen_ndr/ndr_drsblobs.c
+++ b/librpc/gen_ndr/ndr_drsblobs.c
@@ -1213,6 +1213,109 @@ _PUBLIC_ void ndr_print_partialAttributeSetBlob(struct ndr_print *ndr, const cha
 	ndr->depth--;
 }
 
+static enum ndr_err_code ndr_push_drsuapi_MSPrefixMap_Entry(struct ndr_push *ndr, int ndr_flags, const struct drsuapi_MSPrefixMap_Entry *r)
+{
+	{
+		uint32_t _flags_save_STRUCT = ndr->flags;
+		ndr_set_flags(&ndr->flags, LIBNDR_FLAG_NOALIGN);
+		if (ndr_flags & NDR_SCALARS) {
+			NDR_CHECK(ndr_push_align(ndr, 2));
+			NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->entryID));
+			NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->length));
+			NDR_CHECK(ndr_push_array_uint8(ndr, NDR_SCALARS, r->binary_oid, r->length));
+			NDR_CHECK(ndr_push_trailer_align(ndr, 2));
+		}
+		if (ndr_flags & NDR_BUFFERS) {
+		}
+		ndr->flags = _flags_save_STRUCT;
+	}
+	return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_drsuapi_MSPrefixMap_Entry(struct ndr_pull *ndr, int ndr_flags, struct drsuapi_MSPrefixMap_Entry *r)
+{
+	{
+		uint32_t _flags_save_STRUCT = ndr->flags;
+		ndr_set_flags(&ndr->flags, LIBNDR_FLAG_NOALIGN);
+		if (ndr_flags & NDR_SCALARS) {
+			NDR_CHECK(ndr_pull_align(ndr, 2));
+			NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->entryID));
+			NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->length));
+			NDR_PULL_ALLOC_N(ndr, r->binary_oid, r->length);
+			NDR_CHECK(ndr_pull_array_uint8(ndr, NDR_SCALARS, r->binary_oid, r->length));
+			NDR_CHECK(ndr_pull_trailer_align(ndr, 2));
+		}
+		if (ndr_flags & NDR_BUFFERS) {
+		}
+		ndr->flags = _flags_save_STRUCT;
+	}
+	return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_push_drsuapi_MSPrefixMap_Ctr(struct ndr_push *ndr, int ndr_flags, const struct drsuapi_MSPrefixMap_Ctr *r)
+{
+	uint32_t cntr_entries_0;
+	if (ndr_flags & NDR_SCALARS) {
+		NDR_CHECK(ndr_push_align(ndr, 4));
+		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->num_entries));
+		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_size_drsuapi_MSPrefixMap_Ctr(r, ndr->iconv_convenience, ndr->flags)));
+		for (cntr_entries_0 = 0; cntr_entries_0 < r->num_entries; cntr_entries_0++) {
+			NDR_CHECK(ndr_push_drsuapi_MSPrefixMap_Entry(ndr, NDR_SCALARS, &r->entries[cntr_entries_0]));
+		}
+		NDR_CHECK(ndr_push_trailer_align(ndr, 4));
+	}
+	if (ndr_flags & NDR_BUFFERS) {
+	}
+	return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_drsuapi_MSPrefixMap_Ctr(struct ndr_pull *ndr, int ndr_flags, struct drsuapi_MSPrefixMap_Ctr *r)
+{
+	uint32_t cntr_entries_0;
+	TALLOC_CTX *_mem_save_entries_0;
+	if (ndr_flags & NDR_SCALARS) {
+		NDR_CHECK(ndr_pull_align(ndr, 4));
+		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->num_entries));
+		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->__ndr_size));
+		NDR_PULL_ALLOC_N(ndr, r->entries, r->num_entries);
+		_mem_save_entries_0 = NDR_PULL_GET_MEM_CTX(ndr);
+		NDR_PULL_SET_MEM_CTX(ndr, r->entries, 0);
+		for (cntr_entries_0 = 0; cntr_entries_0 < r->num_entries; cntr_entries_0++) {
+			NDR_CHECK(ndr_pull_drsuapi_MSPrefixMap_Entry(ndr, NDR_SCALARS, &r->entries[cntr_entries_0]));
+		}
+		NDR_PULL_SET_MEM_CTX(ndr, _mem_save_entries_0, 0);
+		NDR_CHECK(ndr_pull_trailer_align(ndr, 4));
+	}
+	if (ndr_flags & NDR_BUFFERS) {
+	}
+	return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_drsuapi_MSPrefixMap_Ctr(struct ndr_print *ndr, const char *name, const struct drsuapi_MSPrefixMap_Ctr *r)
+{
+	uint32_t cntr_entries_0;
+	ndr_print_struct(ndr, name, "drsuapi_MSPrefixMap_Ctr");
+	ndr->depth++;
+	ndr_print_uint32(ndr, "num_entries", r->num_entries);
+	ndr_print_uint32(ndr, "__ndr_size", (ndr->flags & LIBNDR_PRINT_SET_VALUES)?ndr_size_drsuapi_MSPrefixMap_Ctr(r, ndr->iconv_convenience, ndr->flags):r->__ndr_size);
+	ndr->print(ndr, "%s: ARRAY(%d)", "entries", (int)r->num_entries);
+	ndr->depth++;
+	for (cntr_entries_0=0;cntr_entries_0<r->num_entries;cntr_entries_0++) {
+		char *idx_0=NULL;
+		if (asprintf(&idx_0, "[%d]", cntr_entries_0) != -1) {
+			ndr_print_drsuapi_MSPrefixMap_Entry(ndr, "entries", &r->entries[cntr_entries_0]);
+			free(idx_0);
+		}
+	}
+	ndr->depth--;
+	ndr->depth--;
+}
+
+_PUBLIC_ size_t ndr_size_drsuapi_MSPrefixMap_Ctr(const struct drsuapi_MSPrefixMap_Ctr *r, struct smb_iconv_convenience *ic, int flags)
+{
+	return ndr_size_struct(r, flags, (ndr_push_flags_fn_t)ndr_push_drsuapi_MSPrefixMap_Ctr, ic);
+}
+
 static enum ndr_err_code ndr_push_prefixMapVersion(struct ndr_push *ndr, int ndr_flags, enum prefixMapVersion r)
 {
 	NDR_CHECK(ndr_push_enum_uint32(ndr, NDR_SCALARS, r));
diff --git a/librpc/gen_ndr/ndr_drsblobs.h b/librpc/gen_ndr/ndr_drsblobs.h
index d32d178..8663348 100644
--- a/librpc/gen_ndr/ndr_drsblobs.h
+++ b/librpc/gen_ndr/ndr_drsblobs.h
@@ -78,6 +78,11 @@ void ndr_print_partialAttributeSetCtr(struct ndr_print *ndr, const char *name, c
 enum ndr_err_code ndr_push_partialAttributeSetBlob(struct ndr_push *ndr, int ndr_flags, const struct partialAttributeSetBlob *r);
 enum ndr_err_code ndr_pull_partialAttributeSetBlob(struct ndr_pull *ndr, int ndr_flags, struct partialAttributeSetBlob *r);
 void ndr_print_partialAttributeSetBlob(struct ndr_print *ndr, const char *name, const struct partialAttributeSetBlob *r);
+void ndr_print_drsuapi_MSPrefixMap_Entry(struct ndr_print *ndr, const char *name, const struct drsuapi_MSPrefixMap_Entry *r);
+enum ndr_err_code ndr_push_drsuapi_MSPrefixMap_Ctr(struct ndr_push *ndr, int ndr_flags, const struct drsuapi_MSPrefixMap_Ctr *r);
+enum ndr_err_code ndr_pull_drsuapi_MSPrefixMap_Ctr(struct ndr_pull *ndr, int ndr_flags, struct drsuapi_MSPrefixMap_Ctr *r);
+void ndr_print_drsuapi_MSPrefixMap_Ctr(struct ndr_print *ndr, const char *name, const struct drsuapi_MSPrefixMap_Ctr *r);
+size_t ndr_size_drsuapi_MSPrefixMap_Ctr(const struct drsuapi_MSPrefixMap_Ctr *r, struct smb_iconv_convenience *ic, int flags);
 void ndr_print_prefixMapVersion(struct ndr_print *ndr, const char *name, enum prefixMapVersion r);
 void ndr_print_prefixMapCtr(struct ndr_print *ndr, const char *name, const union prefixMapCtr *r);
 enum ndr_err_code ndr_push_prefixMapBlob(struct ndr_push *ndr, int ndr_flags, const struct prefixMapBlob *r);
diff --git a/librpc/idl/drsblobs.idl b/librpc/idl/drsblobs.idl
index 8a1e401..3a8805e 100644
--- a/librpc/idl/drsblobs.idl
+++ b/librpc/idl/drsblobs.idl
@@ -177,6 +177,28 @@ interface drsblobs {
 		);
 
 	/*
+	 * MS w2k3 and w2k8 prefixMap format
+	 * There is no version number. Format is:
+	 *   uint32 - number of entries in the map
+	 *   uint32 - total bytes that structure occupies
+	 *   ENTRIES:
+	 *     uint16 - prefix ID (OID's last sub-id encoded. see prefixMap)
+	 *     uint16 - number of bytes in prefix N
+	 *     uint8[N] - BER encoded prefix
+	 */
+	typedef [noprint,flag(NDR_NOALIGN)] struct {
+		uint16 entryID;
+		uint16 length;
+		uint8 binary_oid[length];
+	} drsuapi_MSPrefixMap_Entry;
+
+	typedef [public,gensize] struct {
+		uint32 num_entries;
+		[value(ndr_size_drsuapi_MSPrefixMap_Ctr(r, ndr->iconv_convenience, ndr->flags))] uint32 __ndr_size;
+		drsuapi_MSPrefixMap_Entry entries[num_entries];
+	} drsuapi_MSPrefixMap_Ctr;
+
+	/*
 	 * prefixMap
 	 * w2k  unknown
 	 * w2k3 unknown
diff --git a/librpc/ndr/ndr_drsblobs.c b/librpc/ndr/ndr_drsblobs.c
index aecb0c3..741bf71 100644
--- a/librpc/ndr/ndr_drsblobs.c
+++ b/librpc/ndr/ndr_drsblobs.c
@@ -21,6 +21,7 @@
 
 #include "includes.h"
 #include "librpc/gen_ndr/ndr_drsblobs.h"
+#include "../lib/util/asn1.h"
 
 /* parser auto-generated by pidl, then hand-modified by abartlet */
 
@@ -211,3 +212,27 @@ _PUBLIC_ enum ndr_err_code ndr_pull_trustDomainPasswords(struct ndr_pull *ndr, i
 	return NDR_ERR_SUCCESS;
 }
 
+_PUBLIC_ void ndr_print_drsuapi_MSPrefixMap_Entry(struct ndr_print *ndr, const char *name, const struct drsuapi_MSPrefixMap_Entry *r)
+{
+	ndr_print_struct(ndr, name, "drsuapi_MSPrefixMap_Entry");
+	{
+		uint32_t _flags_save_STRUCT = ndr->flags;
+		ndr_set_flags(&ndr->flags, LIBNDR_FLAG_NOALIGN);
+		ndr->depth++;
+		ndr_print_uint16(ndr, "entryID", r->entryID);
+		ndr->print(ndr, "%-25s: length=%u", "oid", r->length);
+		if (r->binary_oid) {
+			char *partial_oid = NULL;
+			DATA_BLOB oid_blob = data_blob_const(r->binary_oid, r->length);
+			char *hex_str = data_blob_hex_string_upper(ndr, &oid_blob);
+			ber_read_partial_OID_String(ndr, oid_blob, (const char **)&partial_oid);
+			ndr->depth++;
+			ndr->print(ndr, "%-25s: 0x%s (%s)", "binary_oid", hex_str, partial_oid);
+			ndr->depth--;
+			talloc_free(hex_str);
+			talloc_free(partial_oid);
+		}
+		ndr->depth--;
+		ndr->flags = _flags_save_STRUCT;
+	}
+}
diff --git a/librpc/ndr/ndr_drsblobs.h b/librpc/ndr/ndr_drsblobs.h
index 2753225..255bba6 100644
--- a/librpc/ndr/ndr_drsblobs.h
+++ b/librpc/ndr/ndr_drsblobs.h
@@ -24,4 +24,4 @@ _PUBLIC_ enum ndr_err_code ndr_push_trustAuthInOutBlob(struct ndr_push *ndr, int
 _PUBLIC_ enum ndr_err_code ndr_pull_trustAuthInOutBlob(struct ndr_pull *ndr, int ndr_flags, struct trustAuthInOutBlob *r);
 _PUBLIC_ void ndr_print_trustAuthInOutBlob(struct ndr_print *ndr, const char *name, const struct trustAuthInOutBlob *r);
 _PUBLIC_ enum ndr_err_code ndr_pull_trustDomainPasswords(struct ndr_pull *ndr, int ndr_flags, struct trustDomainPasswords *r);
-
+_PUBLIC_ void ndr_print_drsuapi_MSPrefixMap_Entry(struct ndr_print *ndr, const char *name, const struct drsuapi_MSPrefixMap_Entry *r);
diff --git a/source4/lib/ldb-samba/ldif_handlers.c b/source4/lib/ldb-samba/ldif_handlers.c
index 88888bf..a3400dd 100644
--- a/source4/lib/ldb-samba/ldif_handlers.c
+++ b/source4/lib/ldb-samba/ldif_handlers.c
@@ -37,12 +37,18 @@
 
 /*
   use ndr_print_* to convert a NDR formatted blob to a ldif formatted blob
+
+  If mask_errors is true, then function succeeds but out data
+  is set to "<Unable to decode binary data>" message
+
+  \return 0 on success; -1 on error
 */
 static int ldif_write_NDR(struct ldb_context *ldb, void *mem_ctx,
 			  const struct ldb_val *in, struct ldb_val *out,
 			  size_t struct_size,
 			  ndr_pull_flags_fn_t pull_fn,
-			  ndr_print_fn_t print_fn)
+			  ndr_print_fn_t print_fn,
+			  bool mask_errors)
 {
 	uint8_t *p;
 	enum ndr_err_code err;
@@ -54,6 +60,10 @@ static int ldif_write_NDR(struct ldb_context *ldb, void *mem_ctx,
 				   lp_iconv_convenience(ldb_get_opaque(ldb, "loadparm")), 
 				   p, pull_fn);
 	if (err != NDR_ERR_SUCCESS) {
+		/* fail in not in mask_error mode */
+		if (!mask_errors) {
+			return -1;
+		}
 		talloc_free(p);
 		out->data = (uint8_t *)talloc_strdup(mem_ctx, "<Unable to decode binary data>");
 		out->length = strlen((const char *)out->data);
@@ -391,7 +401,8 @@ static int ldif_write_ntSecurityDescriptor(struct ldb_context *ldb, void *mem_ct
 		return ldif_write_NDR(ldb, mem_ctx, in, out, 
 				      sizeof(struct security_descriptor),
 				      (ndr_pull_flags_fn_t)ndr_pull_security_descriptor,
-				      (ndr_print_fn_t)ndr_print_security_descriptor);
+				      (ndr_print_fn_t)ndr_print_security_descriptor,
+				      true);
 				      
 	}
 
@@ -586,11 +597,22 @@ static int ldif_write_prefixMap(struct ldb_context *ldb, void *mem_ctx,
 	uint32_t i;
 
 	if (ldb_get_flags(ldb) & LDB_FLG_SHOW_BINARY) {
-		return ldif_write_NDR(ldb, mem_ctx, in, out, 
-				      sizeof(struct prefixMapBlob),
-				      (ndr_pull_flags_fn_t)ndr_pull_prefixMapBlob,
-				      (ndr_print_fn_t)ndr_print_prefixMapBlob);
-				      
+		int err;
+		/* try to decode the blob as S4 prefixMap */
+		err = ldif_write_NDR(ldb, mem_ctx, in, out,
+		                     sizeof(struct prefixMapBlob),
+		                     (ndr_pull_flags_fn_t)ndr_pull_prefixMapBlob,
+		                     (ndr_print_fn_t)ndr_print_prefixMapBlob,
+		                     false);
+		if (0 == err) {
+			return err;
+		}
+		/* try parsing it as Windows PrefixMap value */
+		return ldif_write_NDR(ldb, mem_ctx, in, out,
+		                      sizeof(struct drsuapi_MSPrefixMap_Ctr),
+		                      (ndr_pull_flags_fn_t)ndr_pull_drsuapi_MSPrefixMap_Ctr,
+		                      (ndr_print_fn_t)ndr_print_drsuapi_MSPrefixMap_Ctr,
+		                      true);
 	}
 
 	blob = talloc(mem_ctx, struct prefixMapBlob);
@@ -791,7 +813,8 @@ static int ldif_write_repsFromTo(struct ldb_context *ldb, void *mem_ctx,
 	return ldif_write_NDR(ldb, mem_ctx, in, out, 
 			      sizeof(struct repsFromToBlob),
 			      (ndr_pull_flags_fn_t)ndr_pull_repsFromToBlob,
-			      (ndr_print_fn_t)ndr_print_repsFromToBlob);
+			      (ndr_print_fn_t)ndr_print_repsFromToBlob,
+			      true);
 }
 
 /*
@@ -803,7 +826,8 @@ static int ldif_write_replPropertyMetaData(struct ldb_context *ldb, void *mem_ct
 	return ldif_write_NDR(ldb, mem_ctx, in, out, 
 			      sizeof(struct replPropertyMetaDataBlob),
 			      (ndr_pull_flags_fn_t)ndr_pull_replPropertyMetaDataBlob,
-			      (ndr_print_fn_t)ndr_print_replPropertyMetaDataBlob);
+			      (ndr_print_fn_t)ndr_print_replPropertyMetaDataBlob,
+			      true);
 }
 
 /*
@@ -815,7 +839,8 @@ static int ldif_write_replUpToDateVector(struct ldb_context *ldb, void *mem_ctx,
 	return ldif_write_NDR(ldb, mem_ctx, in, out, 
 			      sizeof(struct replUpToDateVectorBlob),
 			      (ndr_pull_flags_fn_t)ndr_pull_replUpToDateVectorBlob,
-			      (ndr_print_fn_t)ndr_print_replUpToDateVectorBlob);
+			      (ndr_print_fn_t)ndr_print_replUpToDateVectorBlob,
+			      true);
 }
 
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list