goto failed;
}
- schema_copy->schema_info = talloc_strdup(schema_copy, schema->schema_info);
+ schema_copy->schema_info = talloc(schema_copy, struct dsdb_schema_info);
+ if (!schema_copy->schema_info) {
+ goto failed;
+ }
+ *schema_copy->schema_info = *schema->schema_info;
/* copy classes and attributes*/
for (cls = schema->classes; cls; cls = cls->next) {
const struct drsuapi_DsReplicaOIDMapping_Ctr *ctr)
{
WERROR werr;
- const char *schema_info;
- struct dsdb_schema_prefixmap *pfm;
+ struct dsdb_schema_info *schema_info = NULL;
+ struct dsdb_schema_prefixmap *pfm = NULL;
werr = dsdb_schema_pfm_from_drsuapi_pfm(ctr, true, schema, &pfm, &schema_info);
W_ERROR_NOT_OK_RETURN(werr);
talloc_free(schema->prefixmap);
schema->prefixmap = pfm;
- talloc_free(discard_const(schema->schema_info));
+ talloc_free(schema->schema_info);
schema->schema_info = schema_info;
return WERR_OK;
const struct ldb_val *schemaInfo)
{
WERROR werr;
- const char *schema_info;
- struct dsdb_schema_prefixmap *pfm;
+ struct dsdb_schema_info *schema_info = NULL;
+ struct dsdb_schema_prefixmap *pfm = NULL;
TALLOC_CTX *mem_ctx;
/* verify schemaInfo blob is valid one */
}
/* decode schema_info */
- schema_info = hex_encode_talloc(mem_ctx,
- schemaInfo->data,
- schemaInfo->length);
- if (!schema_info) {
+ werr = dsdb_schema_info_from_blob(schemaInfo, mem_ctx, &schema_info);
+ 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_NOMEM;
+ return werr;
}
/* store prefixMap and schema_info into cached Schema */
talloc_free(schema->prefixmap);
schema->prefixmap = talloc_steal(schema, pfm);
- talloc_free(discard_const(schema->schema_info));
+ talloc_free(schema->schema_info);
schema->schema_info = talloc_steal(schema, schema_info);
/* clean up locally allocated mem */
talloc_free(ctr);
W_ERROR_NOT_OK_RETURN(status);
- *schemaInfo = strhex_to_data_blob(mem_ctx, schema->schema_info);
- W_ERROR_HAVE_NO_MEMORY(schemaInfo->data);
+ status = dsdb_blob_from_schema_info(schema->schema_info, mem_ctx, schemaInfo);
+ W_ERROR_NOT_OK_RETURN(status);
return WERR_OK;
}
bool have_schema_info,
TALLOC_CTX *mem_ctx,
struct dsdb_schema_prefixmap **_pfm,
- const char **_schema_info)
+ struct dsdb_schema_info **_schema_info)
{
WERROR werr;
uint32_t i;
* but set it here for clarity */
i = ctr->num_mappings - 1;
- *_schema_info = hex_encode_talloc(mem_ctx,
- ctr->mappings[i].oid.binary_oid,
- ctr->mappings[i].oid.length);
- if (!*_schema_info) {
+ blob = data_blob_const(ctr->mappings[i].oid.binary_oid,
+ ctr->mappings[i].oid.length);
+ werr = dsdb_schema_info_from_blob(&blob, mem_ctx, _schema_info);
+ if (!W_ERROR_IS_OK(werr)) {
talloc_free(pfm);
- return WERR_NOMEM;
+ return werr;
}
}
* \param _ctr Out pointer to drsuapi_DsReplicaOIDMapping_Ctr prefix map structure
*/
WERROR dsdb_drsuapi_pfm_from_schema_pfm(const struct dsdb_schema_prefixmap *pfm,
- const char *schema_info,
+ const struct dsdb_schema_info *schema_info,
TALLOC_CTX *mem_ctx,
struct drsuapi_DsReplicaOIDMapping_Ctr **_ctr)
{
/* make schema_info entry if needed */
if (schema_info) {
+ WERROR werr;
+
/* by this time, i should have this value,
* but set it here for clarity */
i = ctr->num_mappings - 1;
- blob = strhex_to_data_blob(ctr, schema_info);
- if (!blob.data) {
+ werr = dsdb_blob_from_schema_info(schema_info, ctr, &blob);
+ if (!W_ERROR_IS_OK(werr)) {
talloc_free(ctr);
- return WERR_NOMEM;
+ return werr;
}
ctr->mappings[i].id_prefix = 0;
#include "torture/rpc/drsuapi.h"
#include "torture/drs/proto.h"
#include "param/param.h"
-
+#include "librpc/ndr/libndr.h"
/**
* Private data to be shared among all test in Test case
struct dsdb_schema_prefixmap *pfm_full;
/* default schemaInfo value to test with */
- const char *schi_default_str;
struct dsdb_schema_info *schi_default;
struct ldb_context *ldb_ctx;
static bool torture_drs_unit_pfm_to_from_drsuapi(struct torture_context *tctx, struct drsut_prefixmap_data *priv)
{
WERROR werr;
- const char *schema_info;
+ struct dsdb_schema_info *schema_info;
+ DATA_BLOB schema_info_blob;
struct dsdb_schema_prefixmap *pfm;
struct drsuapi_DsReplicaOIDMapping_Ctr *ctr;
TALLOC_CTX *mem_ctx;
torture_assert(tctx, mem_ctx, "Unexpected: Have no memory!");
/* convert Schema_prefixMap to drsuapi_prefixMap */
- werr = dsdb_drsuapi_pfm_from_schema_pfm(priv->pfm_full, priv->schi_default_str, mem_ctx, &ctr);
+ werr = dsdb_drsuapi_pfm_from_schema_pfm(priv->pfm_full, priv->schi_default, mem_ctx, &ctr);
torture_assert_werr_ok(tctx, werr, "dsdb_drsuapi_pfm_from_schema_pfm() failed");
torture_assert(tctx, ctr && ctr->mappings, "drsuapi_prefixMap not constructed correctly");
torture_assert_int_equal(tctx, ctr->num_mappings, priv->pfm_full->length + 1,
"drs_mappings count does not match");
/* look for schema_info entry - it should be the last one */
- schema_info = hex_encode_talloc(mem_ctx,
- ctr->mappings[ctr->num_mappings - 1].oid.binary_oid,
- ctr->mappings[ctr->num_mappings - 1].oid.length);
- torture_assert_str_equal(tctx,
- schema_info,
- priv->schi_default_str,
- "schema_info not stored correctly or not last entry");
+ schema_info_blob = data_blob_const(ctr->mappings[ctr->num_mappings - 1].oid.binary_oid,
+ ctr->mappings[ctr->num_mappings - 1].oid.length);
+ werr = dsdb_schema_info_from_blob(&schema_info_blob, tctx, &schema_info);
+ torture_assert_werr_ok(tctx, werr, "dsdb_schema_info_from_blob failed");
+ torture_assert_int_equal(tctx, schema_info->revision, priv->schi_default->revision,
+ "schema_info (revision) not stored correctly or not last entry");
+ torture_assert(tctx, GUID_equal(&schema_info->invocation_id, &priv->schi_default->invocation_id),
+ "schema_info (invocation_id) not stored correctly or not last entry");
/* compare schema_prefixMap and drsuapi_prefixMap */
werr = dsdb_schema_pfm_contains_drsuapi_pfm(priv->pfm_full, ctr);
/* convert back drsuapi_prefixMap to schema_prefixMap */
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, priv->schi_default_str, "Fetched schema_info is different");
+ torture_assert_int_equal(tctx, schema_info->revision, priv->schi_default->revision,
+ "Fetched schema_info is different (revision)");
+ torture_assert(tctx, GUID_equal(&schema_info->invocation_id, &priv->schi_default->invocation_id),
+ "Fetched schema_info is different (invocation_id)");
/* compare against the original */
if (!_torture_drs_pfm_compare_same(tctx, priv->pfm_full, pfm, true)) {
static bool torture_drs_unit_pfm_to_from_ldb_val(struct torture_context *tctx, struct drsut_prefixmap_data *priv)
{
WERROR werr;
- const char *schema_info;
struct dsdb_schema *schema;
struct ldb_val pfm_ldb_val;
struct ldb_val schema_info_ldb_val;
/* set priv->pfm_full as prefixMap for new schema object */
schema->prefixmap = priv->pfm_full;
- schema->schema_info = priv->schi_default_str;
+ schema->schema_info = priv->schi_default;
/* convert schema_prefixMap to ldb_val blob */
werr = dsdb_get_oid_mappings_ldb(schema, mem_ctx, &pfm_ldb_val, &schema_info_ldb_val);
"pfm_ldb_val not constructed correctly");
torture_assert(tctx, schema_info_ldb_val.data && schema_info_ldb_val.length,
"schema_info_ldb_val not constructed correctly");
- /* look for schema_info entry - it should be the last one */
- schema_info = hex_encode_talloc(mem_ctx,
- schema_info_ldb_val.data,
- schema_info_ldb_val.length);
- torture_assert_str_equal(tctx,
- schema_info,
- priv->schi_default_str,
- "schema_info not stored correctly or not last entry");
/* convert pfm_ldb_val back to schema_prefixMap */
schema->prefixmap = NULL;
talloc_free(mem_ctx);
return false;
}
+ torture_assert_int_equal(tctx, schema->schema_info->revision, priv->schi_default->revision,
+ "Fetched schema_info is different (revision)");
+ torture_assert(tctx, GUID_equal(&schema->schema_info->invocation_id, &priv->schi_default->invocation_id),
+ "Fetched schema_info is different (invocation_id)");
talloc_free(mem_ctx);
return true;
torture_assert(tctx, schema, "Unexpected: failed to allocate schema object");
/* set priv->pfm_full as prefixMap for new schema object */
schema->prefixmap = priv->pfm_full;
- schema->schema_info = priv->schi_default_str;
+ schema->schema_info = priv->schi_default;
/* write prfixMap to ldb */
werr = dsdb_write_prefixes_from_schema_to_ldb(mem_ctx, priv->ldb_ctx, schema);
schema = dsdb_new_schema(mem_ctx);
torture_assert(tctx, schema, "Unexpected: failed to allocate schema object");
/* set priv->pfm_full as prefixMap for new schema object */
- schema->schema_info = priv->schi_default_str;
+ schema->schema_info = priv->schi_default;
werr = _drsut_prefixmap_new(_prefixmap_test_new_data, ARRAY_SIZE(_prefixmap_test_new_data),
schema, &schema->prefixmap);
torture_assert_werr_ok(tctx, werr, "_drsut_prefixmap_new() failed");
werr = dsdb_blob_from_schema_info(priv->schi_default, priv, &blob);
torture_assert_werr_ok(tctx, werr, "dsdb_blob_from_schema_info() failed");
- priv->schi_default_str = data_blob_hex_string_upper(priv, &blob);
-
/* create temporary LDB and populate with data */
if (!torture_drs_unit_ldb_setup(tctx, priv)) {
return false;
{
DATA_BLOB blob;
struct drsuapi_DsReplicaOIDMapping_Ctr *ctr;
+ struct dsdb_schema_info schema_info;
ctr = talloc_zero(priv, struct drsuapi_DsReplicaOIDMapping_Ctr);
torture_assert(tctx, ctr, "Not enough memory!");
"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!");
+ schema_info = *priv->schema->schema_info;
+ torture_assert_werr_ok(tctx,
+ dsdb_blob_from_schema_info(&schema_info, tctx, &blob),
+ "dsdb_blob_from_schema_info() failed");
ctr->mappings[0].id_prefix = 1;
ctr->mappings[0].oid.length = blob.length;
ctr->mappings[0].oid.binary_oid = blob.data;
"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),
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);
+ torture_assert(tctx,
+ _drsut_schemainfo_new(tctx, SCHEMA_INFO_DEFAULT_STR, &priv->schema->schema_info),
+ "Failed to create schema_info test object");
/* pre-cache invocationId for samdb_ntds_invocation_id()
* to work with our mock ldb */