s4/dsdb: Use default schemaInfo value when no such value is given
authorKamen Mazdrashki <kamenim@samba.org>
Thu, 22 Apr 2010 14:24:15 +0000 (17:24 +0300)
committerKamen Mazdrashki <kamenim@samba.org>
Thu, 29 Apr 2010 01:54:06 +0000 (04:54 +0300)
Having no value for schemaInfo is totally OK as it turns out.
In such cases, we should use a default value with
all fields set to 0.

source4/dsdb/schema/schema_info_attr.c
source4/dsdb/schema/schema_init.c
source4/dsdb/schema/schema_set.c

index 855bc6f08c8bbc17150e9f6976f8a71ec9bf9a42..60722eea52faf674dbb97dd5cdec989b214b9d15 100644 (file)
 #include "param/param.h"
 
 
+/**
+ * Creates and initializes new dsdb_schema_info blob value.
+ * Initial schemaInfo values is with:
+ *   revision = 0
+ *   invocationId = GUID_ZERO
+ */
+WERROR dsdb_schema_info_blob_new(TALLOC_CTX *mem_ctx, DATA_BLOB *_schema_info_blob)
+{
+       DATA_BLOB blob;
+
+       blob = data_blob_talloc_zero(mem_ctx, 21);
+       W_ERROR_HAVE_NO_MEMORY(blob.data);
+
+       /* Set the schemaInfo marker to 0xFF */
+       blob.data[0] = 0xFF;
+
+       *_schema_info_blob = blob;
+
+       return WERR_OK;
+}
+
+
 /**
  * Parse schemaInfo structure from a data_blob
  * (DATA_BLOB or ldb_val).
index 3405e155d3dafcde32609b7731f751a5db0c625a..cdd37f094b88d88e5f251e9daa1343a45c987510 100644 (file)
@@ -734,20 +734,10 @@ int dsdb_schema_from_ldb_results(TALLOC_CTX *mem_ctx, struct ldb_context *ldb,
        }
        info_val = ldb_msg_find_ldb_val(schema_res->msgs[0], "schemaInfo");
        if (!info_val) {
-               struct dsdb_schema_info *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",
-                                                       win_errstr(status));
-                       DEBUG(0,(__location__ ": %s\n", *error_string));
-                       return LDB_ERR_OPERATIONS_ERROR;
-               }
-               status = dsdb_blob_from_schema_info(schema_info, mem_ctx, &info_val_default);
+               status = dsdb_schema_info_blob_new(mem_ctx, &info_val_default);
                if (!W_ERROR_IS_OK(status)) {
                        *error_string = talloc_asprintf(mem_ctx,
-                                                       "schema_fsmo_init: dsdb_blob_from_schema_info() failed - %s",
+                                                       "schema_fsmo_init: dsdb_schema_info_blob_new() failed - %s",
                                                        win_errstr(status));
                        DEBUG(0,(__location__ ": %s\n", *error_string));
                        return LDB_ERR_OPERATIONS_ERROR;
index f0c3c068cda94f17727c471415eb5f550cef589e..fe6ef42e8c39a471c2422effbc57e59b02415ad5 100644 (file)
@@ -582,7 +582,6 @@ WERROR dsdb_set_schema_from_ldif(struct ldb_context *ldb, const char *pf, const
        const struct ldb_val *prefix_val;
        const struct ldb_val *info_val;
        struct ldb_val info_val_default;
-       struct dsdb_schema_info *schema_info;
 
 
        mem_ctx = talloc_new(ldb);
@@ -623,9 +622,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, 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);
+               status = dsdb_schema_info_blob_new(mem_ctx, &info_val_default);
                W_ERROR_NOT_OK_GOTO(status, failed);
                info_val = &info_val_default;
        }