s3:registry: fix broken use of dbwrap store record in v1_to_v2 upgrade code
authorMichael Adam <obnox@samba.org>
Thu, 25 Aug 2011 15:12:33 +0000 (17:12 +0200)
committerMichael Adam <obnox@samba.org>
Tue, 11 Oct 2011 13:20:53 +0000 (15:20 +0200)
This also fixes broken private_data parameter for the traverse function
(making use of it): Originally a memory context was handed in but was not used.

source3/registry/reg_backend_db.c

index 6e5e1501ac7e33cb223bcbb26400a02abafcd92c..f6a676756a2b36c7efa88267c4838a19accee9a7 100644 (file)
@@ -366,15 +366,20 @@ static int regdb_normalize_keynames_fn(struct db_record *rec,
        TALLOC_CTX *mem_ctx = talloc_tos();
        const char *keyname;
        NTSTATUS status;
+       struct db_context *db = (struct db_context *)private_data;
 
        if (rec->key.dptr == NULL || rec->key.dsize == 0) {
                return 0;
        }
 
+       if (db == NULL) {
+               DEBUG(0, ("regdb_normalize_keynames_fn: ERROR: "
+                         "NULL db context handed in via private_data\n"));
+               return 1;
+       }
+
        keyname = strchr((const char *) rec->key.dptr, '/');
        if (keyname) {
-               struct db_record new_rec;
-
                keyname = talloc_string_sub(mem_ctx,
                                            (const char *) rec->key.dptr,
                                            "/",
@@ -384,10 +389,6 @@ static int regdb_normalize_keynames_fn(struct db_record *rec,
                          (const char *) rec->key.dptr,
                          keyname));
 
-               new_rec.value = rec->value;
-               new_rec.key = string_term_tdb_data(keyname);
-               new_rec.private_data = rec->private_data;
-
                /* Delete the original record and store the normalized key */
                status = rec->delete_rec(rec);
                if (!NT_STATUS_IS_OK(status)) {
@@ -397,7 +398,8 @@ static int regdb_normalize_keynames_fn(struct db_record *rec,
                        return 1;
                }
 
-               status = rec->store(&new_rec, new_rec.value, TDB_REPLACE);
+               status = dbwrap_store_bystring(db, keyname, rec->value,
+                                              TDB_REPLACE);
                if (!NT_STATUS_IS_OK(status)) {
                        DEBUG(0,("regdb_normalize_keynames_fn: "
                                 "failed to store new record for [%s]!\n",
@@ -438,7 +440,7 @@ static WERROR regdb_upgrade_v1_to_v2(struct db_context *db)
 
        mem_ctx = talloc_stackframe();
 
-       rc = regdb->traverse(db, regdb_normalize_keynames_fn, mem_ctx);
+       rc = db->traverse(db, regdb_normalize_keynames_fn, db);
 
        talloc_free(mem_ctx);