s4/dsdb: Let caller to control if valid invocationId is critical or zero-guid is...
authorKamen Mazdrashki <kamenim@samba.org>
Thu, 8 Apr 2010 05:27:07 +0000 (08:27 +0300)
committerKamen Mazdrashki <kamenim@samba.org>
Fri, 9 Apr 2010 09:21:33 +0000 (12:21 +0300)
source4/dsdb/schema/schema_info_attr.c
source4/dsdb/schema/schema_init.c
source4/dsdb/schema/schema_set.c
source4/torture/drs/unit/schemainfo_tests.c

index 2d3dfc827ca01c1108cc479d431590e7aa1454c4..21ffb1d79f1b84cebf9aa0771d9eac42d2bc9cb7 100644 (file)
@@ -297,14 +297,19 @@ static WERROR dsdb_module_schema_info_write(struct ldb_module *ldb_module,
 /**
  * Creates new dsdb_schema_info object using
  * invocationId from supplied ldb
+ * @param check_invocation_id Error out if invocationId is not yet set
  */
-WERROR dsdb_schema_info_create(struct ldb_context *ldb, TALLOC_CTX *mem_ctx, struct dsdb_schema_info **_schema_info)
+WERROR dsdb_schema_info_create(struct ldb_context *ldb, bool check_invocation_id,
+                              TALLOC_CTX *mem_ctx, struct dsdb_schema_info **_schema_info)
 {
        const struct GUID *invocation_id;
        struct dsdb_schema_info *schema_info;
 
        /* try to determine invocationId from ldb */
        invocation_id = samdb_ntds_invocation_id(ldb);
+       if (check_invocation_id && !invocation_id) {
+               return WERR_INTERNAL_DB_CORRUPTION;
+       }
 
        schema_info = talloc(mem_ctx, struct dsdb_schema_info);
        if (!schema_info) {
index 1f2b1b8e1728c50aef8a0b2c70ba02613918a1ba..eb3400cedc69519ea3168f3149c5c7ad50dc1f86 100644 (file)
@@ -736,7 +736,7 @@ int dsdb_schema_from_ldb_results(TALLOC_CTX *mem_ctx, struct ldb_context *ldb,
        if (!info_val) {
                struct dsdb_schema_info *schema_info;
 
-               status = dsdb_schema_info_create(ldb, mem_ctx, &schema_info);
+               status = dsdb_schema_info_create(ldb, false, mem_ctx, &schema_info);
                if (!W_ERROR_IS_OK(status)) {
                        *error_string = talloc_asprintf(mem_ctx,
                                                        "schema_fsmo_init: dsdb_schema_info_create() failed - %s",
index 9dcf2b8d426ed9c46c9f797c3fccbf65f6f42908..f0c3c068cda94f17727c471415eb5f550cef589e 100644 (file)
@@ -623,7 +623,7 @@ WERROR dsdb_set_schema_from_ldif(struct ldb_context *ldb, const char *pf, const
 
        info_val = ldb_msg_find_ldb_val(msg, "schemaInfo");
        if (!info_val) {
-               status = dsdb_schema_info_create(ldb, mem_ctx, &schema_info);
+               status = dsdb_schema_info_create(ldb, false, mem_ctx, &schema_info);
                W_ERROR_NOT_OK_GOTO(status, failed);
                status = dsdb_blob_from_schema_info(schema_info, mem_ctx, &info_val_default);
                W_ERROR_NOT_OK_GOTO(status, failed);
index ab9de87f2213cbc344fa957b3ab3cc4ff9706bbb..7928855fb3e726d2307e64b847017d7b86fbd858 100644 (file)
@@ -348,7 +348,7 @@ static bool test_dsdb_schema_info_create(struct torture_context *tctx,
        WERROR werr;
        struct dsdb_schema_info *schema_info = NULL;
 
-       werr = dsdb_schema_info_create(priv->ldb, priv, &schema_info);
+       werr = dsdb_schema_info_create(priv->ldb, true, priv, &schema_info);
        torture_assert_werr_ok(tctx, werr, "dsdb_schema_info_create() failed");
 
        torture_assert(tctx, schema_info, "schema_info is NULL after dsdb_schema_info_create()");