[SCM] Samba Shared Repository - branch master updated

Kamen Mazdrashki kamenim at samba.org
Fri Sep 17 04:51:53 MDT 2010


The branch, master has been updated
       via  311744a s4-test: Add unit test for dsdb_schema_info_cmp()
       via  9256b5f s4-schema: Helper func to compare schemaInfo signitures
       via  1295da9 s4-schema: use dsdb_schema_info_blob_is_valid() to verify schemaInfo blob
       via  aedefd3 s4-prefixMap: use dsdb_schema_info_blob_is_valid() for schemaInfo blob validation
       via  e691b1f s4-dsdb: Add dsdb_schema_info_blob_is_valid() to verify schemaInfo blobls
       via  c79861a s4-pyrpc: Print location and type name we got when checking for types
      from  e2d6b64 Fix array size of  a memmber of struct cli_ulogoff_state

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


- Log -----------------------------------------------------------------
commit 311744a1312d4be51c0d50a71884f604ea2e3b99
Author: Kamen Mazdrashki <kamenim at samba.org>
Date:   Fri Sep 17 05:28:36 2010 +0300

    s4-test: Add unit test for dsdb_schema_info_cmp()

commit 9256b5f22677cc265b0560a15c0e0a719ba3138d
Author: Kamen Mazdrashki <kamenim at samba.org>
Date:   Fri Sep 17 02:54:46 2010 +0300

    s4-schema: Helper func to compare schemaInfo signitures

commit 1295da92f9a5272b73a0abcecb680f7c0d5bc854
Author: Kamen Mazdrashki <kamenim at samba.org>
Date:   Fri Sep 17 02:48:50 2010 +0300

    s4-schema: use dsdb_schema_info_blob_is_valid() to verify schemaInfo blob
    
    instead of parsing it.

commit aedefd3e99f36d11e49e6fbf51cb16ceffec13c4
Author: Kamen Mazdrashki <kamenim at samba.org>
Date:   Fri Sep 17 02:45:59 2010 +0300

    s4-prefixMap: use dsdb_schema_info_blob_is_valid() for schemaInfo blob validation
    
    This fixes a leaking dsdb_schema_info object also.

commit e691b1fd276bbf26961a23a5c450e96f16da5d4e
Author: Kamen Mazdrashki <kamenim at samba.org>
Date:   Fri Sep 17 02:37:46 2010 +0300

    s4-dsdb: Add dsdb_schema_info_blob_is_valid() to verify schemaInfo blobls

commit c79861a14e671ea037f550dbf5c2ae9e84fb3803
Author: Kamen Mazdrashki <kamenim at samba.org>
Date:   Thu Sep 16 02:17:34 2010 +0300

    s4-pyrpc: Print location and type name we got when checking for types

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

Summary of changes:
 source4/dsdb/schema/schema_info_attr.c      |   75 +++++++++++++++++++++---
 source4/dsdb/schema/schema_init.c           |   15 ++---
 source4/dsdb/schema/schema_prefixmap.c      |    6 +-
 source4/librpc/rpc/pyrpc.h                  |    2 +-
 source4/torture/drs/unit/schemainfo_tests.c |   81 +++++++++++++++++++++++++++
 5 files changed, 155 insertions(+), 24 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/dsdb/schema/schema_info_attr.c b/source4/dsdb/schema/schema_info_attr.c
index a9c5e93..0b5d50b 100644
--- a/source4/dsdb/schema/schema_info_attr.c
+++ b/source4/dsdb/schema/schema_info_attr.c
@@ -70,6 +70,28 @@ WERROR dsdb_schema_info_blob_new(TALLOC_CTX *mem_ctx, DATA_BLOB *_schema_info_bl
 
 
 /**
+ * Verify the 'blob' is a valid schemaInfo blob
+ */
+bool dsdb_schema_info_blob_is_valid(const DATA_BLOB *blob)
+{
+	if (!blob || !blob->data) {
+		return false;
+	}
+
+	/* schemaInfo blob must be 21 bytes long */
+	if (blob->length != 21) {
+		return false;
+	}
+
+	/* schemaInfo blob should start with 0xFF */
+	if (blob->data[0] != 0xFF) {
+		return false;
+	}
+
+	return true;
+}
+
+/**
  * Parse schemaInfo structure from a data_blob
  * (DATA_BLOB or ldb_val).
  * Suitable for parsing blobs that comes from
@@ -83,16 +105,8 @@ WERROR dsdb_schema_info_from_blob(const DATA_BLOB *blob,
 	struct dsdb_schema_info *schema_info;
 	struct schemaInfoBlob schema_info_blob;
 
-	if (!blob || !blob->data) {
-		return WERR_INVALID_PARAMETER;
-	}
-
-	if (blob->length != 21) {
-		return WERR_INVALID_PARAMETER;
-	}
-
-	/* schemaInfo blob should start with 0xFF */
-	if (blob->data[0] != 0xFF) {
+	/* verify schemaInfo blob is valid */
+	if (!dsdb_schema_info_blob_is_valid(blob)) {
 		return WERR_INVALID_PARAMETER;
 	}
 
@@ -150,6 +164,47 @@ WERROR dsdb_blob_from_schema_info(const struct dsdb_schema_info *schema_info,
 	return WERR_OK;
 }
 
+/**
+ * Compares schemaInfo signatures in dsdb_schema and prefixMap.
+ * NOTE: At present function compares schemaInfo values
+ * as string without taking into account schemVersion field
+ *
+ * @return WERR_OK if schemaInfos are equal
+ * 	   WERR_DS_DRA_SCHEMA_MISMATCH if schemaInfos are different
+ */
+WERROR dsdb_schema_info_cmp(const struct dsdb_schema *schema,
+			    const struct drsuapi_DsReplicaOIDMapping_Ctr *ctr)
+{
+	bool bres;
+	DATA_BLOB blob;
+	char *schema_info_str;
+	struct drsuapi_DsReplicaOIDMapping *mapping;
+
+	/* we should have at least schemaInfo element */
+	if (ctr->num_mappings < 1) {
+		return WERR_INVALID_PARAMETER;
+	}
+
+	/* verify schemaInfo element is valid */
+	mapping = &ctr->mappings[ctr->num_mappings - 1];
+	if (mapping->id_prefix != 0) {
+		return WERR_INVALID_PARAMETER;
+	}
+
+	blob = data_blob_const(mapping->oid.binary_oid, mapping->oid.length);
+	if (!dsdb_schema_info_blob_is_valid(&blob)) {
+		return WERR_INVALID_PARAMETER;
+	}
+
+	schema_info_str = hex_encode_talloc(NULL, blob.data, blob.length);
+	W_ERROR_HAVE_NO_MEMORY(schema_info_str);
+
+	bres = strequal(schema->schema_info, schema_info_str);
+	talloc_free(schema_info_str);
+
+	return bres ? WERR_OK : WERR_DS_DRA_SCHEMA_MISMATCH;
+}
+
 
 /**
  * Reads schema_info structure from schemaInfo
diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c
index a95e7ec..ba12f52 100644
--- a/source4/dsdb/schema/schema_init.c
+++ b/source4/dsdb/schema/schema_init.c
@@ -113,20 +113,17 @@ WERROR dsdb_load_oid_mappings_ldb(struct dsdb_schema *schema,
 	WERROR werr;
 	const char *schema_info;
 	struct dsdb_schema_prefixmap *pfm;
-	struct dsdb_schema_info *schi;
 	TALLOC_CTX *mem_ctx;
 
+	/* verify schemaInfo blob is valid one */
+	if (!dsdb_schema_info_blob_is_valid(schemaInfo)) {
+		DEBUG(0,(__location__": dsdb_schema_info_blob_is_valid() failed.\n"));
+	        return WERR_INVALID_PARAMETER;
+	}
+
 	mem_ctx = talloc_new(schema);
 	W_ERROR_HAVE_NO_MEMORY(mem_ctx);
 
-	/* parse schemaInfo blob to verify it is valid */
-	werr = dsdb_schema_info_from_blob(schemaInfo, mem_ctx, &schi);
-	if (!W_ERROR_IS_OK(werr)) {
-		DEBUG(0, (__location__ " dsdb_schema_info_from_blob failed: %s\n", win_errstr(werr)));
-		talloc_free(mem_ctx);
-		return werr;
-	}
-
 	/* fetch prefixMap */
 	werr = _dsdb_prefixmap_from_ldb_val(prefixMap,
 					    mem_ctx, &pfm);
diff --git a/source4/dsdb/schema/schema_prefixmap.c b/source4/dsdb/schema/schema_prefixmap.c
index 50f74b7..8105f12 100644
--- a/source4/dsdb/schema/schema_prefixmap.c
+++ b/source4/dsdb/schema/schema_prefixmap.c
@@ -394,7 +394,6 @@ static WERROR _dsdb_drsuapi_pfm_verify(const struct drsuapi_DsReplicaOIDMapping_
 
 	if (have_schema_info) {
 		DATA_BLOB blob;
-		struct dsdb_schema_info *schi = NULL;
 
 		if (ctr->num_mappings < 2) {
 			return WERR_INVALID_PARAMETER;
@@ -406,10 +405,9 @@ static WERROR _dsdb_drsuapi_pfm_verify(const struct drsuapi_DsReplicaOIDMapping_
 			return WERR_INVALID_PARAMETER;
 		}
 
-		/* parse schemaInfo blob to verify it is valid */
+		/* verify schemaInfo blob is valid one */
 		blob = data_blob_const(mapping->oid.binary_oid, mapping->oid.length);
-		if (!W_ERROR_IS_OK(dsdb_schema_info_from_blob(&blob, talloc_autofree_context(), &schi))) {
-			talloc_free(schi);
+		if (!dsdb_schema_info_blob_is_valid(&blob)) {
 			return WERR_INVALID_PARAMETER;
 		}
 
diff --git a/source4/librpc/rpc/pyrpc.h b/source4/librpc/rpc/pyrpc.h
index 651f8f1..c3bc838 100644
--- a/source4/librpc/rpc/pyrpc.h
+++ b/source4/librpc/rpc/pyrpc.h
@@ -24,7 +24,7 @@
 
 #define PY_CHECK_TYPE(type, var, fail) \
 	if (!PyObject_TypeCheck(var, type)) {\
-		PyErr_Format(PyExc_TypeError, "Expected type %s for %s", (type)->tp_name, #var); \
+		PyErr_Format(PyExc_TypeError, __location__ ": Expected type '%s' for '%s' of type '%s'", (type)->tp_name, #var, Py_TYPE(var)->tp_name); \
 		fail; \
 	}
 
diff --git a/source4/torture/drs/unit/schemainfo_tests.c b/source4/torture/drs/unit/schemainfo_tests.c
index 3958eb3..e419ab0 100644
--- a/source4/torture/drs/unit/schemainfo_tests.c
+++ b/source4/torture/drs/unit/schemainfo_tests.c
@@ -297,6 +297,82 @@ static bool test_dsdb_blob_from_schema_info(struct torture_context *tctx,
 	return true;
 }
 
+static bool test_dsdb_schema_info_cmp(struct torture_context *tctx,
+				      struct drsut_schemainfo_data *priv)
+{
+	DATA_BLOB blob;
+	struct drsuapi_DsReplicaOIDMapping_Ctr *ctr;
+
+	ctr = talloc_zero(priv, struct drsuapi_DsReplicaOIDMapping_Ctr);
+	torture_assert(tctx, ctr, "Not enough memory!");
+
+	/* not enough elements */
+	torture_assert_werr_equal(tctx,
+				  dsdb_schema_info_cmp(priv->schema, ctr),
+				  WERR_INVALID_PARAMETER,
+				  "dsdb_schema_info_cmp(): unexpected result");
+
+	/* an empty element for schemaInfo */
+	ctr->num_mappings = 1;
+	ctr->mappings = talloc_zero_array(ctr, struct drsuapi_DsReplicaOIDMapping, 1);
+	torture_assert(tctx, ctr->mappings, "Not enough memory!");
+	torture_assert_werr_equal(tctx,
+				  dsdb_schema_info_cmp(priv->schema, ctr),
+				  WERR_INVALID_PARAMETER,
+				  "dsdb_schema_info_cmp(): unexpected result");
+
+	/* test with invalid schemaInfo - length != 21 */
+	blob = strhex_to_data_blob(ctr, "FF00000001FD821C07C7455143A3DB51F75A630A7F00");
+	torture_assert(tctx, blob.data, "Not enough memory!");
+	ctr->mappings[0].oid.length     = blob.length;
+	ctr->mappings[0].oid.binary_oid = blob.data;
+	torture_assert_werr_equal(tctx,
+				  dsdb_schema_info_cmp(priv->schema, ctr),
+				  WERR_INVALID_PARAMETER,
+				  "dsdb_schema_info_cmp(): unexpected result");
+
+	/* test with invalid schemaInfo - marker != 0xFF */
+	blob = strhex_to_data_blob(ctr, "AA00000001FD821C07C7455143A3DB51F75A630A7F");
+	torture_assert(tctx, blob.data, "Not enough memory!");
+	ctr->mappings[0].oid.length     = blob.length;
+	ctr->mappings[0].oid.binary_oid = blob.data;
+	torture_assert_werr_equal(tctx,
+				  dsdb_schema_info_cmp(priv->schema, ctr),
+				  WERR_INVALID_PARAMETER,
+				  "dsdb_schema_info_cmp(): unexpected result");
+
+	/* test with valid schemaInfo, but not correct one */
+	blob = strhex_to_data_blob(ctr, "FF0000000000000000000000000000000000000000");
+	torture_assert(tctx, blob.data, "Not enough memory!");
+	ctr->mappings[0].oid.length     = blob.length;
+	ctr->mappings[0].oid.binary_oid = blob.data;
+	torture_assert_werr_equal(tctx,
+				  dsdb_schema_info_cmp(priv->schema, ctr),
+				  WERR_DS_DRA_SCHEMA_MISMATCH,
+				  "dsdb_schema_info_cmp(): unexpected result");
+
+	/* test with correct schemaInfo, but invalid ATTID */
+	blob = strhex_to_data_blob(ctr, priv->schema->schema_info);
+	torture_assert(tctx, blob.data, "Not enough memory!");
+	ctr->mappings[0].id_prefix	= 1;
+	ctr->mappings[0].oid.length     = blob.length;
+	ctr->mappings[0].oid.binary_oid = blob.data;
+	torture_assert_werr_equal(tctx,
+				  dsdb_schema_info_cmp(priv->schema, ctr),
+				  WERR_INVALID_PARAMETER,
+				  "dsdb_schema_info_cmp(): unexpected result");
+
+	/* test with valid schemaInfo */
+	blob = strhex_to_data_blob(ctr, priv->schema->schema_info);
+	ctr->mappings[0].id_prefix	= 0;
+	torture_assert_werr_ok(tctx,
+			       dsdb_schema_info_cmp(priv->schema, ctr),
+			       "dsdb_schema_info_cmp(): unexpected result");
+
+	talloc_free(ctr);
+	return true;
+}
+
 /*
  * Tests dsdb_module_schema_info_blob_read()
  *   and dsdb_module_schema_info_blob_write()
@@ -515,6 +591,9 @@ static bool torture_drs_unit_schemainfo_setup(struct torture_context *tctx,
 	/* create schema mockup object */
 	priv->schema = dsdb_new_schema(priv);
 
+	/* set schema_info in dsdb_schema for testing */
+	priv->schema->schema_info = talloc_strdup(priv->schema, SCHEMA_INFO_DEFAULT_STR);
+
 	/* pre-cache invocationId for samdb_ntds_invocation_id()
 	 * to work with our mock ldb */
 	ldb_err = ldb_set_opaque(priv->ldb, "cache.invocation_id",
@@ -575,6 +654,8 @@ struct torture_tcase * torture_drs_unit_schemainfo(struct torture_suite *suite)
 				      (pfn_run)test_dsdb_schema_info_from_blob);
 	torture_tcase_add_simple_test(tc, "dsdb_blob_from_schema_info",
 				      (pfn_run)test_dsdb_blob_from_schema_info);
+	torture_tcase_add_simple_test(tc, "dsdb_schema_info_cmp",
+				      (pfn_run)test_dsdb_schema_info_cmp);
 	torture_tcase_add_simple_test(tc, "dsdb_module_schema_info_blob read|write",
 				      (pfn_run)test_dsdb_module_schema_info_blob_rw);
 	torture_tcase_add_simple_test(tc, "dsdb_module_schema_info_update",


-- 
Samba Shared Repository


More information about the samba-cvs mailing list