]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
dsdb: Rework schema_init module to always use valid memory
authorAndrew Bartlett <abartlet@samba.org>
Thu, 8 Jun 2017 11:05:26 +0000 (23:05 +1200)
committerStefan Metzmacher <metze@samba.org>
Thu, 22 Jun 2017 11:07:41 +0000 (13:07 +0200)
The schema can go away unless the second argument (the memory context) is supplied

Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
source4/dsdb/samdb/ldb_modules/schema_load.c

index a2f8e57b29c0d46a3d3124838868ddc5fd40f4bb..b3313b45d6b4c5dbe16290f39e7d87861e0d3a9c 100644 (file)
@@ -358,29 +358,15 @@ failed:
        return ret;
 }      
 
-
-static int schema_load_init(struct ldb_module *module)
+static int schema_load(struct ldb_context *ldb,
+                      struct ldb_module *module)
 {
-       struct schema_load_private_data *private_data;
-       struct ldb_context *ldb = ldb_module_get_ctx(module);
        struct dsdb_schema *schema;
        void *readOnlySchema;
        int ret, metadata_ret;
-
-       private_data = talloc_zero(module, struct schema_load_private_data);
-       if (private_data == NULL) {
-               return ldb_oom(ldb);
-       }
-       private_data->module = module;
+       TALLOC_CTX *frame = talloc_stackframe();
        
-       ldb_module_set_private(module, private_data);
-
-       ret = ldb_next_init(module);
-       if (ret != LDB_SUCCESS) {
-               return ret;
-       }
-
-       schema = dsdb_get_schema(ldb, NULL);
+       schema = dsdb_get_schema(ldb, frame);
 
        metadata_ret = schema_metadata_open(module);
 
@@ -394,10 +380,12 @@ static int schema_load_init(struct ldb_module *module)
                                ldb_debug_set(ldb, LDB_DEBUG_FATAL,
                                              "schema_load_init: dsdb_set_schema_refresh_fns() failed: %d:%s: %s",
                                              ret, ldb_strerror(ret), ldb_errstring(ldb));
+                               TALLOC_FREE(frame);
                                return ret;
                        }
                }
 
+               TALLOC_FREE(frame);
                return LDB_SUCCESS;
        }
 
@@ -408,11 +396,12 @@ static int schema_load_init(struct ldb_module *module)
         * have to update the backend server schema too */
        if (readOnlySchema != NULL) {
                struct dsdb_schema *new_schema;
-               ret = dsdb_schema_from_db(module, private_data, 0, &new_schema);
+               ret = dsdb_schema_from_db(module, frame, 0, &new_schema);
                if (ret != LDB_SUCCESS) {
                        ldb_debug_set(ldb, LDB_DEBUG_FATAL,
                                      "schema_load_init: dsdb_schema_from_db() failed: %d:%s: %s",
                                      ret, ldb_strerror(ret), ldb_errstring(ldb));
+                       TALLOC_FREE(frame);
                        return ret;
                }
 
@@ -422,6 +411,7 @@ static int schema_load_init(struct ldb_module *module)
                        ldb_debug_set(ldb, LDB_DEBUG_FATAL,
                                      "schema_load_init: dsdb_set_schema() failed: %d:%s: %s",
                                      ret, ldb_strerror(ret), ldb_errstring(ldb));
+                       TALLOC_FREE(frame);
                        return ret;
                }
 
@@ -432,20 +422,23 @@ static int schema_load_init(struct ldb_module *module)
                        ldb_debug_set(ldb, LDB_DEBUG_FATAL,
                                      "schema_load_init: dsdb_set_schema_refresh_fns() failed: %d:%s: %s",
                                      ret, ldb_strerror(ret), ldb_errstring(ldb));
+                       TALLOC_FREE(frame);
                        return ret;
                }
        } else {
                ldb_debug_set(ldb, LDB_DEBUG_FATAL,
                              "schema_load_init: failed to open metadata.tdb");
+               TALLOC_FREE(frame);
                return metadata_ret;
        }
 
-       schema = dsdb_get_schema(ldb, NULL);
+       schema = dsdb_get_schema(ldb, frame);
 
        /* We do this, invoking the refresh handler, so we know that it works */
        if (schema == NULL) {
                ldb_debug_set(ldb, LDB_DEBUG_FATAL,
                              "schema_load_init: dsdb_get_schema failed");
+               TALLOC_FREE(frame);
                return LDB_ERR_OPERATIONS_ERROR;
        }
 
@@ -457,6 +450,35 @@ static int schema_load_init(struct ldb_module *module)
                                       "@INDEXLIST and @ATTRIBUTES "
                                       "records to match database schema: %s",
                                       ldb_errstring(ldb));
+               TALLOC_FREE(frame);
+               return ret;
+       }
+
+       TALLOC_FREE(frame);
+       return LDB_SUCCESS;
+}
+
+static int schema_load_init(struct ldb_module *module)
+{
+       struct ldb_context *ldb = ldb_module_get_ctx(module);
+       struct schema_load_private_data *private_data;
+       int ret;
+
+       private_data = talloc_zero(module, struct schema_load_private_data);
+       if (private_data == NULL) {
+               return ldb_oom(ldb);
+       }
+       private_data->module = module;
+
+       ldb_module_set_private(module, private_data);
+
+       ret = ldb_next_init(module);
+       if (ret != LDB_SUCCESS) {
+               return ret;
+       }
+
+       ret = schema_load(ldb, module);
+       if (ret != LDB_SUCCESS) {
                return ret;
        }