s4/drs: dsdb_schema_pfm_from_drsuapi_pfm() to accept partial drsuapi_prefixMap
authorKamen Mazdrashki <kamen.mazdrashki@postpath.com>
Tue, 3 Nov 2009 06:49:36 +0000 (07:49 +0100)
committerStefan Metzmacher <metze@samba.org>
Fri, 6 Nov 2009 13:05:44 +0000 (14:05 +0100)
"partial drsuapi_prefixMap" is a prefix map without last entry
being special - i.e. map that does not contains schema_info entry.

Test for dsdb_schema_pfm_from_drsuapi_pfm() were also extended to
cover both 'full' and 'partial' map conversion.

Signed-off-by: Stefan Metzmacher <metze@samba.org>
source4/dsdb/schema/schema_init.c
source4/dsdb/schema/schema_prefixmap.c
source4/torture/drs/unit/prefixmap_tests.c

index ba14d378c15c6f00e33f7058fe268b78309463c6..5ce537a4e7ff526cd1bff98b20474d2fbcf95c9b 100644 (file)
@@ -52,7 +52,7 @@ WERROR dsdb_load_prefixmap_from_drsuapi(struct dsdb_schema *schema,
        const char *schema_info;
        struct dsdb_schema_prefixmap *pfm;
 
-       werr = dsdb_schema_pfm_from_drsuapi_pfm(ctr, schema, &pfm, &schema_info);
+       werr = dsdb_schema_pfm_from_drsuapi_pfm(ctr, true, schema, &pfm, &schema_info);
        W_ERROR_NOT_OK_RETURN(werr);
 
        /* set loaded prefixMap */
index 326628e95eb7f1da9ad635ad52e717800c4c7c93..cda6f75e5a6e84b51a06a618efa89ae5b0096b2c 100644 (file)
@@ -329,9 +329,11 @@ WERROR dsdb_schema_pfm_oid_from_attid(struct dsdb_schema_prefixmap *pfm, uint32_
 /**
  * Verifies drsuapi mappings.
  */
-static WERROR _dsdb_drsuapi_pfm_verify(const struct drsuapi_DsReplicaOIDMapping_Ctr *ctr)
+static WERROR _dsdb_drsuapi_pfm_verify(const struct drsuapi_DsReplicaOIDMapping_Ctr *ctr,
+                                      bool have_schema_info)
 {
        uint32_t i;
+       uint32_t num_mappings;
        struct drsuapi_DsReplicaOIDMapping *mapping;
 
        /* check input params */
@@ -341,27 +343,34 @@ static WERROR _dsdb_drsuapi_pfm_verify(const struct drsuapi_DsReplicaOIDMapping_
        if (!ctr->mappings) {
                return WERR_INVALID_PARAMETER;
        }
-       if (ctr->num_mappings < 2) {
-               return WERR_INVALID_PARAMETER;
-       }
+       num_mappings = ctr->num_mappings;
 
-       /* check last entry for being special */
-       mapping = &ctr->mappings[ctr->num_mappings - 1];
-       if (!mapping->oid.binary_oid) {
-               return WERR_INVALID_PARAMETER;
-       }
-       if (mapping->id_prefix != 0) {
-               return WERR_INVALID_PARAMETER;
-       }
-       if (mapping->oid.length != 21) {
-               return WERR_INVALID_PARAMETER;
-       }
-       if (*mapping->oid.binary_oid != 0xFF) {
-               return WERR_INVALID_PARAMETER;
+       if (have_schema_info) {
+               if (ctr->num_mappings < 2) {
+                       return WERR_INVALID_PARAMETER;
+               }
+
+               /* check last entry for being special */
+               mapping = &ctr->mappings[ctr->num_mappings - 1];
+               if (!mapping->oid.binary_oid) {
+                       return WERR_INVALID_PARAMETER;
+               }
+               if (mapping->id_prefix != 0) {
+                       return WERR_INVALID_PARAMETER;
+               }
+               if (mapping->oid.length != 21) {
+                       return WERR_INVALID_PARAMETER;
+               }
+               if (*mapping->oid.binary_oid != 0xFF) {
+                       return WERR_INVALID_PARAMETER;
+               }
+
+               /* get number of read mappings in the map */
+               num_mappings--;
        }
 
        /* now, verify rest of entries for being at least not null */
-       for (i = 0; i < ctr->num_mappings - 1; i++) {
+       for (i = 0; i < num_mappings; i++) {
                mapping = &ctr->mappings[i];
                if (!mapping->oid.length) {
                        return WERR_INVALID_PARAMETER;
@@ -382,11 +391,13 @@ static WERROR _dsdb_drsuapi_pfm_verify(const struct drsuapi_DsReplicaOIDMapping_
  * Convert drsuapi_ prefix map to prefixMap internal presentation.
  *
  * \param ctr Pointer to drsuapi_DsReplicaOIDMapping_Ctr which represents drsuapi_ prefixMap
+ * \param have_schema_info if drsuapi_prefixMap have schem_info in it or not
  * \param mem_ctx TALLOC_CTX to make allocations in
  * \param _pfm Out pointer to hold newly created prefixMap
  * \param _schema_info Out param to store schema_info to. If NULL, schema_info is not decoded
  */
 WERROR dsdb_schema_pfm_from_drsuapi_pfm(const struct drsuapi_DsReplicaOIDMapping_Ctr *ctr,
+                                       bool have_schema_info,
                                        TALLOC_CTX *mem_ctx,
                                        struct dsdb_schema_prefixmap **_pfm,
                                        const char **_schema_info)
@@ -394,18 +405,31 @@ WERROR dsdb_schema_pfm_from_drsuapi_pfm(const struct drsuapi_DsReplicaOIDMapping
        WERROR werr;
        uint32_t i;
        DATA_BLOB blob;
+       uint32_t num_mappings;
        struct dsdb_schema_prefixmap *pfm;
 
        if (!_pfm) {
                return WERR_INVALID_PARAMETER;
        }
 
+       /*
+        * error out if schema_info is requested
+        * but it is not in the drsuapi_prefixMap
+        */
+       if (_schema_info && !have_schema_info) {
+               return WERR_INVALID_PARAMETER;
+       }
+
        /* verify drsuapi_pefixMap */
-       werr =_dsdb_drsuapi_pfm_verify(ctr));
+       werr =_dsdb_drsuapi_pfm_verify(ctr, have_schema_info);
        W_ERROR_NOT_OK_RETURN(werr);
 
        /* allocate mem for prefix map */
-       pfm = _dsdb_schema_prefixmap_talloc(mem_ctx, ctr->num_mappings - 1);
+       num_mappings = ctr->num_mappings;
+       if (have_schema_info) {
+               num_mappings--;
+       }
+       pfm = _dsdb_schema_prefixmap_talloc(mem_ctx, num_mappings);
        W_ERROR_HAVE_NO_MEMORY(pfm);
 
        /* copy entries from drsuapi_prefixMap */
@@ -529,7 +553,7 @@ WERROR dsdb_schema_pfm_contains_drsuapi_pfm(const struct dsdb_schema_prefixmap *
        DATA_BLOB bin_oid;
 
        /* verify drsuapi_pefixMap */
-       werr = _dsdb_drsuapi_pfm_verify(ctr);
+       werr = _dsdb_drsuapi_pfm_verify(ctr, true);
        W_ERROR_NOT_OK_RETURN(werr);
 
        /* check pfm contains every entry from ctr, except the last one */
index ea5802fcca0907813212f1e70ad8d74e835f9952..f89d5d95d7202b0a89d0e022558631f55a3db272 100644 (file)
@@ -391,9 +391,19 @@ static bool torture_drs_unit_pfm_to_from_drsuapi(struct torture_context *tctx, s
        torture_assert_werr_ok(tctx, werr, "dsdb_schema_pfm_contains_drsuapi_pfm() failed");
 
        /* convert back drsuapi_prefixMap to schema_prefixMap */
-       werr = dsdb_schema_pfm_from_drsuapi_pfm(ctr, mem_ctx, &pfm, &schema_info);
+       werr = dsdb_schema_pfm_from_drsuapi_pfm(ctr, true, mem_ctx, &pfm, &schema_info);
        torture_assert_werr_ok(tctx, werr, "dsdb_schema_pfm_from_drsuapi_pfm() failed");
+       torture_assert_str_equal(tctx, schema_info, schema_info_default, "Fetched schema_info is different");
+       /* compare against the original */
+       if (!_torture_drs_pfm_compare_same(tctx, priv->pfm_full, pfm)) {
+               talloc_free(mem_ctx);
+               return false;
+       }
 
+       /* test conversion with partial drsuapi_prefixMap */
+       ctr->num_mappings--;
+       werr = dsdb_schema_pfm_from_drsuapi_pfm(ctr, false, mem_ctx, &pfm, NULL);
+       torture_assert_werr_ok(tctx, werr, "dsdb_schema_pfm_from_drsuapi_pfm() failed");
        /* compare against the original */
        if (!_torture_drs_pfm_compare_same(tctx, priv->pfm_full, pfm)) {
                talloc_free(mem_ctx);