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 <[email protected]>
Date:   Fri Sep 17 05:28:36 2010 +0300

    s4-test: Add unit test for dsdb_schema_info_cmp()

commit 9256b5f22677cc265b0560a15c0e0a719ba3138d
Author: Kamen Mazdrashki <[email protected]>
Date:   Fri Sep 17 02:54:46 2010 +0300

    s4-schema: Helper func to compare schemaInfo signitures

commit 1295da92f9a5272b73a0abcecb680f7c0d5bc854
Author: Kamen Mazdrashki <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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

Reply via email to