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.
#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).
}
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;
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);
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;
}