From 4ba2ac073d7a7859ab73f8b7f40d630ddbff8687 Mon Sep 17 00:00:00 2001 From: Kamen Mazdrashki Date: Thu, 8 Apr 2010 10:23:13 +0300 Subject: [PATCH] s4/dsdb: split writing of schemaInfo blob in two parts ldb_msg preparation is moved into separate function so that it can be used for implementing schemaInfo updates both on module stack (dsdb_module_... functions) and directly on ldb_context --- source4/dsdb/schema/schema_info_attr.c | 67 ++++++++++++++++++-------- 1 file changed, 46 insertions(+), 21 deletions(-) diff --git a/source4/dsdb/schema/schema_info_attr.c b/source4/dsdb/schema/schema_info_attr.c index 21ffb1d79f..ea4d066ff1 100644 --- a/source4/dsdb/schema/schema_info_attr.c +++ b/source4/dsdb/schema/schema_info_attr.c @@ -171,6 +171,46 @@ WERROR dsdb_module_schema_info_blob_read(struct ldb_module *ldb_module, return WERR_OK; } +/** + * Pepares ldb_msg to be used for updating schemaInfo value in DB + */ +static WERROR _dsdb_schema_info_write_prepare(struct ldb_context *ldb, + DATA_BLOB *schema_info_blob, + TALLOC_CTX *mem_ctx, + struct ldb_message **_msg) +{ + int ldb_err; + struct ldb_message *msg; + struct ldb_dn *schema_dn; + struct ldb_message_element *return_el; + + schema_dn = samdb_schema_dn(ldb); + if (!schema_dn) { + DEBUG(0,("_dsdb_schema_info_write_prepare: no schema dn present\n")); + return WERR_INTERNAL_DB_CORRUPTION; + } + + /* prepare ldb_msg to update schemaInfo */ + msg = ldb_msg_new(mem_ctx); + W_ERROR_HAVE_NO_MEMORY(msg); + + msg->dn = schema_dn; + ldb_err = ldb_msg_add_value(msg, "schemaInfo", schema_info_blob, &return_el); + if (ldb_err != 0) { + DEBUG(0,("_dsdb_schema_info_write_prepare: ldb_msg_add_value failed - %s\n", + ldb_strerror(ldb_err))); + talloc_free(msg); + return WERR_INTERNAL_ERROR; + } + + /* mark schemaInfo element for replacement */ + return_el->flags = LDB_FLAG_MOD_REPLACE; + + *_msg = msg; + + return WERR_OK; +} + /** * Writes schema_info structure into schemaInfo * attribute on SCHEMA partition @@ -182,37 +222,22 @@ WERROR dsdb_module_schema_info_blob_write(struct ldb_module *ldb_module, DATA_BLOB *schema_info_blob) { int ldb_err; + WERROR werr; struct ldb_message *msg; - struct ldb_dn *schema_dn; - struct ldb_message_element *return_el; TALLOC_CTX *temp_ctx; - schema_dn = samdb_schema_dn(ldb_module_get_ctx(ldb_module)); - if (!schema_dn) { - DEBUG(0,("dsdb_module_schema_info_blob_write: no schema dn present\n")); - return WERR_INTERNAL_DB_CORRUPTION; - } - temp_ctx = talloc_new(ldb_module); W_ERROR_HAVE_NO_MEMORY(temp_ctx); /* write serialized schemaInfo into LDB */ - msg = ldb_msg_new(temp_ctx); - if (!msg) { - talloc_free(temp_ctx); - return WERR_NOMEM; - } - - msg->dn = schema_dn; - ldb_err = ldb_msg_add_value(msg, "schemaInfo", schema_info_blob, &return_el); - if (ldb_err != 0) { + werr = _dsdb_schema_info_write_prepare(ldb_module_get_ctx(ldb_module), + schema_info_blob, + temp_ctx, &msg); + if (!W_ERROR_IS_OK(werr)) { talloc_free(temp_ctx); - DEBUG(0,("dsdb_module_schema_info_blob_write: ldb_msg_add_value failed\n")); - return WERR_NOMEM; + return werr; } - /* mark schemaInfo element for replacement */ - return_el->flags = LDB_FLAG_MOD_REPLACE; ldb_err = dsdb_module_modify(ldb_module, msg, dsdb_flags | DSDB_MODIFY_PERMISSIVE); -- 2.34.1