]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s4:dsdb/schema: Remove unused old schema from memory
authorAndrew Bartlett <abartlet@samba.org>
Thu, 4 Aug 2016 03:25:52 +0000 (15:25 +1200)
committerJeremy Allison <jra@samba.org>
Wed, 10 Aug 2016 22:49:14 +0000 (00:49 +0200)
This avoids confusion when reading the talloc dump from a ldb context that has
been the target of replication, as the dsdb_schema_copy_shallow() memory was
still around, if unused.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=12115

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

index 1b29c4dce4b3beaa800ccca3fe27008e2286dcec..a404e0acdfc6f39278df5d6910b6cdef31bf461a 100644 (file)
@@ -566,6 +566,8 @@ int dsdb_set_global_schema(struct ldb_context *ldb)
 {
        int ret;
        void *use_global_schema = (void *)1;
+       struct dsdb_schema *old_schema = ldb_get_opaque(ldb, "dsdb_schema");
+
        ret = ldb_set_opaque(ldb, "dsdb_use_global_schema", use_global_schema);
        if (ret != LDB_SUCCESS) {
                return ret;
@@ -575,6 +577,16 @@ int dsdb_set_global_schema(struct ldb_context *ldb)
                return LDB_SUCCESS;
        }
 
+       /* Remove any pointer to a previous schema */
+       ret = ldb_set_opaque(ldb, "dsdb_schema", NULL);
+       if (ret != LDB_SUCCESS) {
+               return ret;
+       }
+
+       /* Remove the reference to the schema we just overwrote - if there was
+        * none, NULL is harmless here */
+       talloc_unlink(ldb, old_schema);
+
        /* Set the new attributes based on the new schema */
        ret = dsdb_schema_set_indices_and_attributes(ldb, global_schema, false /* Don't write indices and attributes, it's expensive */);
        if (ret == LDB_SUCCESS) {