From 2b380c73a4796bdf69264e5ca6721ad0d67087e9 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Fri, 3 Jul 2009 16:40:43 +0200 Subject: s3:registry: add db_context argument to regdb_delete_key_with_prefix() Michael --- source3/registry/reg_backend_db.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index e296d319e2..bdb237aafc 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -511,7 +511,8 @@ int regdb_get_seqnum(void) } -static WERROR regdb_delete_key_with_prefix(const char *keyname, +static WERROR regdb_delete_key_with_prefix(struct db_context *db, + const char *keyname, const char *prefix) { char *path; @@ -537,7 +538,7 @@ static WERROR regdb_delete_key_with_prefix(const char *keyname, goto done; } - werr = ntstatus_to_werror(dbwrap_delete_bystring(regdb, path)); + werr = ntstatus_to_werror(dbwrap_delete_bystring(db, path)); /* treat "not" found" as ok */ if (W_ERROR_EQUAL(werr, WERR_NOT_FOUND)) { @@ -552,17 +553,17 @@ done: static WERROR regdb_delete_values(const char *keyname) { - return regdb_delete_key_with_prefix(keyname, REG_VALUE_PREFIX); + return regdb_delete_key_with_prefix(regdb, keyname, REG_VALUE_PREFIX); } static WERROR regdb_delete_secdesc(const char *keyname) { - return regdb_delete_key_with_prefix(keyname, REG_SECDESC_PREFIX); + return regdb_delete_key_with_prefix(regdb, keyname, REG_SECDESC_PREFIX); } static WERROR regdb_delete_subkeylist(const char *keyname) { - return regdb_delete_key_with_prefix(keyname, NULL); + return regdb_delete_key_with_prefix(regdb, keyname, NULL); } static WERROR regdb_delete_key_lists(const char *keyname) -- cgit From ec6b6727d824bea1b4a7b320e7a3c1de38df6724 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Fri, 3 Jul 2009 16:42:20 +0200 Subject: s3:registry: add db_context argument to regdb_delete_values() Michael --- source3/registry/reg_backend_db.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index bdb237aafc..bcec77926b 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -551,9 +551,9 @@ done: } -static WERROR regdb_delete_values(const char *keyname) +static WERROR regdb_delete_values(struct db_context *db, const char *keyname) { - return regdb_delete_key_with_prefix(regdb, keyname, REG_VALUE_PREFIX); + return regdb_delete_key_with_prefix(db, keyname, REG_VALUE_PREFIX); } static WERROR regdb_delete_secdesc(const char *keyname) @@ -570,7 +570,7 @@ static WERROR regdb_delete_key_lists(const char *keyname) { WERROR werr; - werr = regdb_delete_values(keyname); + werr = regdb_delete_values(regdb, keyname); if (!W_ERROR_IS_OK(werr)) { DEBUG(1, (__location__ " Deleting %s/%s failed: %s\n", REG_VALUE_PREFIX, keyname, win_errstr(werr))); -- cgit From bd983dba6b308c28019c2e39f16de8b9e434e4f5 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Fri, 3 Jul 2009 16:44:20 +0200 Subject: s3:registry: add db_context argument to regdb_delete_secdesc() Michael --- source3/registry/reg_backend_db.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index bcec77926b..1a6ae7bb45 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -556,9 +556,9 @@ static WERROR regdb_delete_values(struct db_context *db, const char *keyname) return regdb_delete_key_with_prefix(db, keyname, REG_VALUE_PREFIX); } -static WERROR regdb_delete_secdesc(const char *keyname) +static WERROR regdb_delete_secdesc(struct db_context *db, const char *keyname) { - return regdb_delete_key_with_prefix(regdb, keyname, REG_SECDESC_PREFIX); + return regdb_delete_key_with_prefix(db, keyname, REG_SECDESC_PREFIX); } static WERROR regdb_delete_subkeylist(const char *keyname) @@ -577,7 +577,7 @@ static WERROR regdb_delete_key_lists(const char *keyname) goto done; } - werr = regdb_delete_secdesc(keyname); + werr = regdb_delete_secdesc(regdb, keyname); if (!W_ERROR_IS_OK(werr)) { DEBUG(1, (__location__ " Deleting %s/%s failed: %s\n", REG_SECDESC_PREFIX, keyname, win_errstr(werr))); -- cgit From 86e927cb056b30be3b2eecc1375549de71419b1f Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Fri, 3 Jul 2009 16:48:36 +0200 Subject: s3:registry: add db_context argument to regdb_delete_subkeylist() Michael --- source3/registry/reg_backend_db.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 1a6ae7bb45..69676b19e6 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -561,9 +561,9 @@ static WERROR regdb_delete_secdesc(struct db_context *db, const char *keyname) return regdb_delete_key_with_prefix(db, keyname, REG_SECDESC_PREFIX); } -static WERROR regdb_delete_subkeylist(const char *keyname) +static WERROR regdb_delete_subkeylist(struct db_context *db, const char *keyname) { - return regdb_delete_key_with_prefix(regdb, keyname, NULL); + return regdb_delete_key_with_prefix(db, keyname, NULL); } static WERROR regdb_delete_key_lists(const char *keyname) @@ -584,7 +584,7 @@ static WERROR regdb_delete_key_lists(const char *keyname) goto done; } - werr = regdb_delete_subkeylist(keyname); + werr = regdb_delete_subkeylist(regdb, keyname); if (!W_ERROR_IS_OK(werr)) { DEBUG(1, (__location__ " Deleting %s failed: %s\n", keyname, win_errstr(werr))); -- cgit From 528bf38875b9e5412da0a2810b17f05b2c376312 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Fri, 3 Jul 2009 16:51:26 +0200 Subject: s3:registry: add db_context argument to regdb_delete_key_lists() Michael --- source3/registry/reg_backend_db.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 69676b19e6..700db0140f 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -566,25 +566,25 @@ static WERROR regdb_delete_subkeylist(struct db_context *db, const char *keyname return regdb_delete_key_with_prefix(db, keyname, NULL); } -static WERROR regdb_delete_key_lists(const char *keyname) +static WERROR regdb_delete_key_lists(struct db_context *db, const char *keyname) { WERROR werr; - werr = regdb_delete_values(regdb, keyname); + werr = regdb_delete_values(db, keyname); if (!W_ERROR_IS_OK(werr)) { DEBUG(1, (__location__ " Deleting %s/%s failed: %s\n", REG_VALUE_PREFIX, keyname, win_errstr(werr))); goto done; } - werr = regdb_delete_secdesc(regdb, keyname); + werr = regdb_delete_secdesc(db, keyname); if (!W_ERROR_IS_OK(werr)) { DEBUG(1, (__location__ " Deleting %s/%s failed: %s\n", REG_SECDESC_PREFIX, keyname, win_errstr(werr))); goto done; } - werr = regdb_delete_subkeylist(regdb, keyname); + werr = regdb_delete_subkeylist(db, keyname); if (!W_ERROR_IS_OK(werr)) { DEBUG(1, (__location__ " Deleting %s failed: %s\n", keyname, win_errstr(werr))); @@ -810,7 +810,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr) goto cancel; } - werr = regdb_delete_key_lists(path); + werr = regdb_delete_key_lists(regdb, path); W_ERROR_NOT_OK_GOTO(werr, cancel); TALLOC_FREE(path); @@ -984,7 +984,7 @@ static WERROR regdb_delete_subkey(const char *key, const char *subkey) werr = regdb_transaction_start(); W_ERROR_NOT_OK_GOTO_DONE(werr); - werr = regdb_delete_key_lists(path); + werr = regdb_delete_key_lists(regdb, path); W_ERROR_NOT_OK_GOTO(werr, cancel); werr = regsubkey_ctr_init(mem_ctx, &subkeys); -- cgit From a18a10c07a3e32644c31f4742805795998227e44 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Fri, 3 Jul 2009 17:00:44 +0200 Subject: s3:registry: add db_context argument to regdb_store_keys_internal() Michael --- source3/registry/reg_backend_db.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 700db0140f..f4a269ef46 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -601,7 +601,9 @@ done: fstrings ***********************************************************************/ -static bool regdb_store_keys_internal(const char *key, struct regsubkey_ctr *ctr) +static bool regdb_store_keys_internal(struct db_context *db, + const char *key, + struct regsubkey_ctr *ctr) { TDB_DATA dbuf; uint8 *buffer = NULL; @@ -675,7 +677,7 @@ static bool regdb_store_keys_internal(const char *key, struct regsubkey_ctr *ctr dbuf.dptr = buffer; dbuf.dsize = len; - status = dbwrap_store_bystring(regdb, keyname, dbuf, TDB_REPLACE); + status = dbwrap_store_bystring(db, keyname, dbuf, TDB_REPLACE); if (!NT_STATUS_IS_OK(status)) { ret = false; goto done; @@ -688,7 +690,7 @@ static bool regdb_store_keys_internal(const char *key, struct regsubkey_ctr *ctr keyname = talloc_asprintf(ctx, "%s/%s", REG_SORTED_SUBKEYS_PREFIX, keyname); if (keyname != NULL) { - dbwrap_delete_bystring(regdb, keyname); + dbwrap_delete_bystring(db, keyname); } done: @@ -820,7 +822,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr) /* (2) store the subkey list for the parent */ - if (!regdb_store_keys_internal(key, ctr) ) { + if (!regdb_store_keys_internal(regdb, key, ctr)) { DEBUG(0,("regdb_store_keys: Failed to store new subkey list " "for parent [%s]\n", key)); goto cancel; @@ -837,7 +839,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr) goto cancel; } - if (!regdb_store_keys_internal(key, subkeys)) { + if (!regdb_store_keys_internal(regdb, key, subkeys)) { DEBUG(0,("regdb_store_keys: Failed to store " "new record for key [%s]\n", key)); goto cancel; @@ -861,7 +863,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr) if (regdb_fetch_keys( path, subkeys ) == -1) { /* create a record with 0 subkeys */ - if (!regdb_store_keys_internal(path, subkeys)) { + if (!regdb_store_keys_internal(regdb, path, subkeys)) { DEBUG(0,("regdb_store_keys: Failed to store " "new record for key [%s]\n", path)); goto cancel; @@ -931,7 +933,7 @@ static WERROR regdb_create_subkey(const char *key, const char *subkey) werr = regsubkey_ctr_addkey(subkeys, subkey); W_ERROR_NOT_OK_GOTO(werr, cancel); - if (!regdb_store_keys_internal(key, subkeys)) { + if (!regdb_store_keys_internal(regdb, key, subkeys)) { DEBUG(0, (__location__ " failed to store new subkey list for " "parent key %s\n", key)); werr = WERR_REG_IO_FAILURE; @@ -998,7 +1000,7 @@ static WERROR regdb_delete_subkey(const char *key, const char *subkey) werr = regsubkey_ctr_delkey(subkeys, subkey); W_ERROR_NOT_OK_GOTO(werr, cancel); - if (!regdb_store_keys_internal(key, subkeys)) { + if (!regdb_store_keys_internal(regdb, key, subkeys)) { DEBUG(0, (__location__ " failed to store new subkey_list for " "parent key %s\n", key)); werr = WERR_REG_IO_FAILURE; -- cgit From c01d955ac0b6ef686cf026cc90074cd52a1a30ae Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Fri, 3 Jul 2009 17:10:09 +0200 Subject: s3:registry: add db_context argument to regdb_fetch_key_internal() Michael --- source3/registry/reg_backend_db.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index f4a269ef46..165c0abf59 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -1027,7 +1027,8 @@ done: return werr; } -static TDB_DATA regdb_fetch_key_internal(TALLOC_CTX *mem_ctx, const char *key) +static TDB_DATA regdb_fetch_key_internal(struct db_context *db, + TALLOC_CTX *mem_ctx, const char *key) { char *path = NULL; TDB_DATA data; @@ -1037,7 +1038,7 @@ static TDB_DATA regdb_fetch_key_internal(TALLOC_CTX *mem_ctx, const char *key) return make_tdb_data(NULL, 0); } - data = dbwrap_fetch_bystring(regdb, mem_ctx, path); + data = dbwrap_fetch_bystring(db, mem_ctx, path); TALLOC_FREE(path); return data; @@ -1325,7 +1326,7 @@ static bool regdb_key_exists(const char *key) p = strrchr(path, '/'); if (p == NULL) { /* this is a base key */ - value = regdb_fetch_key_internal(mem_ctx, path); + value = regdb_fetch_key_internal(regdb, mem_ctx, path); ret = (value.dptr != NULL); } else { *p = '\0'; @@ -1366,7 +1367,7 @@ int regdb_fetch_keys(const char *key, struct regsubkey_ctr *ctr) goto done; } - value = regdb_fetch_key_internal(frame, key); + value = regdb_fetch_key_internal(regdb, frame, key); if (value.dptr == NULL) { DEBUG(10, ("regdb_fetch_keys: no subkeys found for key [%s]\n", @@ -1501,7 +1502,7 @@ int regdb_fetch_values(const char* key, struct regval_ctr *values) values->seqnum = regdb_get_seqnum(); - value = regdb_fetch_key_internal(ctx, keystr); + value = regdb_fetch_key_internal(regdb, ctx, keystr); if (!value.dptr) { /* all keys have zero values by default */ -- cgit From db4f797e3533b97df844a50a92e8a27a9248092b Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Fri, 3 Jul 2009 17:18:19 +0200 Subject: s3:registry: add db_context argument to scan_parent_subkeys() Michael --- source3/registry/reg_backend_db.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 165c0abf59..562e29742d 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -1245,7 +1245,8 @@ static int parent_subkey_scanner(TDB_DATA key, TDB_DATA data, return 0; } -static bool scan_parent_subkeys(const char *parent, const char *name) +static bool scan_parent_subkeys(struct db_context *db, const char *parent, + const char *name) { char *path = NULL; char *key = NULL; @@ -1272,8 +1273,8 @@ static bool scan_parent_subkeys(const char *parent, const char *name) } state.scanned = false; - res = regdb->parse_record(regdb, string_term_tdb_data(key), - parent_subkey_scanner, &state); + res = db->parse_record(db, string_term_tdb_data(key), + parent_subkey_scanner, &state); if (state.scanned) { result = state.found; @@ -1281,8 +1282,8 @@ static bool scan_parent_subkeys(const char *parent, const char *name) if (!create_sorted_subkeys(path, key)) { goto fail; } - res = regdb->parse_record(regdb, string_term_tdb_data(key), - parent_subkey_scanner, &state); + res = db->parse_record(db, string_term_tdb_data(key), + parent_subkey_scanner, &state); if ((res == 0) && (state.scanned)) { result = state.found; } @@ -1330,7 +1331,7 @@ static bool regdb_key_exists(const char *key) ret = (value.dptr != NULL); } else { *p = '\0'; - ret = scan_parent_subkeys(path, p+1); + ret = scan_parent_subkeys(regdb, path, p+1); } done: -- cgit From 589bacfbdb7541be5d339fcaf08272520bf6a1ac Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Fri, 3 Jul 2009 17:39:17 +0200 Subject: s3:registry: create regdb_fetch_keys_internal() with db_context argument and let exported regdb_fetch_keys() just call regdb_fetch_keys_internal() with regdb as an argument. Internally, in reg_backend_db.c, always use the _internal version. Michael --- source3/registry/reg_backend_db.c | 62 ++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 27 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 562e29742d..efbd678437 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -27,8 +27,10 @@ static struct db_context *regdb = NULL; static int regdb_refcount; -static bool regdb_key_exists(const char *key); +static bool regdb_key_exists(struct db_context *db, const char *key); static bool regdb_key_is_base_key(const char *key); +static int regdb_fetch_keys_internal(struct db_context *db, const char *key, + struct regsubkey_ctr *ctr); /* List the deepest path into the registry. All part components will be created.*/ @@ -173,7 +175,7 @@ static WERROR init_registry_key_internal(const char *add_path) goto fail; } - regdb_fetch_keys(base, subkeys); + regdb_fetch_keys_internal(regdb, base, subkeys); if (*subkeyname) { werr = regsubkey_ctr_addkey(subkeys, subkeyname); if (!W_ERROR_IS_OK(werr)) { @@ -202,7 +204,7 @@ WERROR init_registry_key(const char *add_path) { WERROR werr; - if (regdb_key_exists(add_path)) { + if (regdb_key_exists(regdb, add_path)) { return WERR_OK; } @@ -248,7 +250,7 @@ WERROR init_registry_data(void) * If all do already exist, we can save the writes. */ for (i=0; builtin_registry_paths[i] != NULL; i++) { - if (!regdb_key_exists(builtin_registry_paths[i])) { + if (!regdb_key_exists(regdb, builtin_registry_paths[i])) { goto do_init; } } @@ -294,7 +296,7 @@ do_init: /* loop over all of the predefined paths and add each component */ for (i=0; builtin_registry_paths[i] != NULL; i++) { - if (regdb_key_exists(builtin_registry_paths[i])) { + if (regdb_key_exists(regdb, builtin_registry_paths[i])) { continue; } werr = init_registry_key_internal(builtin_registry_paths[i]); @@ -713,7 +715,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr) TALLOC_CTX *ctx = talloc_stackframe(); WERROR werr; - if (!regdb_key_is_base_key(key) && !regdb_key_exists(key)) { + if (!regdb_key_is_base_key(key) && !regdb_key_exists(regdb, key)) { goto fail; } @@ -728,7 +730,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr) return false; } - regdb_fetch_keys(key, old_subkeys); + regdb_fetch_keys_internal(regdb, key, old_subkeys); num_subkeys = regsubkey_ctr_numkeys(ctr); old_num_subkeys = regsubkey_ctr_numkeys(old_subkeys); @@ -770,7 +772,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr) goto cancel; } - regdb_fetch_keys(key, old_subkeys); + regdb_fetch_keys_internal(regdb, key, old_subkeys); /* * Make the store operation as safe as possible without transactions: @@ -861,7 +863,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr) goto cancel; } - if (regdb_fetch_keys( path, subkeys ) == -1) { + if (regdb_fetch_keys_internal(regdb, path, subkeys) == -1) { /* create a record with 0 subkeys */ if (!regdb_store_keys_internal(regdb, path, subkeys)) { DEBUG(0,("regdb_store_keys: Failed to store " @@ -899,7 +901,7 @@ static WERROR regdb_create_subkey(const char *key, const char *subkey) struct regsubkey_ctr *subkeys; TALLOC_CTX *mem_ctx = talloc_stackframe(); - if (!regdb_key_is_base_key(key) && !regdb_key_exists(key)) { + if (!regdb_key_is_base_key(key) && !regdb_key_exists(regdb, key)) { werr = WERR_NOT_FOUND; goto done; } @@ -907,7 +909,7 @@ static WERROR regdb_create_subkey(const char *key, const char *subkey) werr = regsubkey_ctr_init(mem_ctx, &subkeys); W_ERROR_NOT_OK_GOTO_DONE(werr); - if (regdb_fetch_keys(key, subkeys) < 0) { + if (regdb_fetch_keys_internal(regdb, key, subkeys) < 0) { werr = WERR_REG_IO_FAILURE; goto done; } @@ -925,7 +927,7 @@ static WERROR regdb_create_subkey(const char *key, const char *subkey) werr = regsubkey_ctr_init(mem_ctx, &subkeys); W_ERROR_NOT_OK_GOTO(werr, cancel); - if (regdb_fetch_keys(key, subkeys) < 0) { + if (regdb_fetch_keys_internal(regdb, key, subkeys) < 0) { werr = WERR_REG_IO_FAILURE; goto cancel; } @@ -967,7 +969,7 @@ static WERROR regdb_delete_subkey(const char *key, const char *subkey) char *path; TALLOC_CTX *mem_ctx = talloc_stackframe(); - if (!regdb_key_is_base_key(key) && !regdb_key_exists(key)) { + if (!regdb_key_is_base_key(key) && !regdb_key_exists(regdb, key)) { werr = WERR_NOT_FOUND; goto done; } @@ -978,7 +980,7 @@ static WERROR regdb_delete_subkey(const char *key, const char *subkey) goto done; } - if (!regdb_key_exists(path)) { + if (!regdb_key_exists(regdb, path)) { werr = WERR_OK; goto done; } @@ -992,7 +994,7 @@ static WERROR regdb_delete_subkey(const char *key, const char *subkey) werr = regsubkey_ctr_init(mem_ctx, &subkeys); W_ERROR_NOT_OK_GOTO(werr, cancel); - if (regdb_fetch_keys(key, subkeys) < 0) { + if (regdb_fetch_keys_internal(regdb, key, subkeys) < 0) { werr = WERR_REG_IO_FAILURE; goto cancel; } @@ -1128,7 +1130,7 @@ static bool create_sorted_subkeys(const char *key, const char *sorted_keyname) goto fail; } - res = regdb_fetch_keys(key, ctr); + res = regdb_fetch_keys_internal(regdb, key, ctr); if (res == -1) { goto fail; } @@ -1303,7 +1305,7 @@ static bool scan_parent_subkeys(struct db_context *db, const char *parent, * The exeption of this are keys without a parent key, * i.e. the "base" keys (HKLM, HKCU, ...). */ -static bool regdb_key_exists(const char *key) +static bool regdb_key_exists(struct db_context *db, const char *key) { TALLOC_CTX *mem_ctx = talloc_stackframe(); TDB_DATA value; @@ -1327,11 +1329,11 @@ static bool regdb_key_exists(const char *key) p = strrchr(path, '/'); if (p == NULL) { /* this is a base key */ - value = regdb_fetch_key_internal(regdb, mem_ctx, path); + value = regdb_fetch_key_internal(db, mem_ctx, path); ret = (value.dptr != NULL); } else { *p = '\0'; - ret = scan_parent_subkeys(regdb, path, p+1); + ret = scan_parent_subkeys(db, path, p+1); } done: @@ -1345,7 +1347,8 @@ done: released by the caller. ***********************************************************************/ -int regdb_fetch_keys(const char *key, struct regsubkey_ctr *ctr) +static int regdb_fetch_keys_internal(struct db_context *db, const char *key, + struct regsubkey_ctr *ctr) { WERROR werr; uint32 num_items; @@ -1359,16 +1362,16 @@ int regdb_fetch_keys(const char *key, struct regsubkey_ctr *ctr) DEBUG(11,("regdb_fetch_keys: Enter key => [%s]\n", key ? key : "NULL")); - if (!regdb_key_exists(key)) { + if (!regdb_key_exists(db, key)) { goto done; } - werr = regsubkey_ctr_set_seqnum(ctr, regdb_get_seqnum()); + werr = regsubkey_ctr_set_seqnum(ctr, db->get_seqnum(db)); if (!W_ERROR_IS_OK(werr)) { goto done; } - value = regdb_fetch_key_internal(regdb, frame, key); + value = regdb_fetch_key_internal(db, frame, key); if (value.dptr == NULL) { DEBUG(10, ("regdb_fetch_keys: no subkeys found for key [%s]\n", @@ -1399,6 +1402,11 @@ done: return ret; } +int regdb_fetch_keys(const char *key, struct regsubkey_ctr *ctr) +{ + return regdb_fetch_keys_internal(regdb, key, ctr); +} + /**************************************************************************** Unpack a list of registry values frem the TDB ***************************************************************************/ @@ -1492,7 +1500,7 @@ int regdb_fetch_values(const char* key, struct regval_ctr *values) DEBUG(10,("regdb_fetch_values: Looking for value of key [%s] \n", key)); - if (!regdb_key_exists(key)) { + if (!regdb_key_exists(regdb, key)) { goto done; } @@ -1529,7 +1537,7 @@ bool regdb_store_values(const char *key, struct regval_ctr *values) DEBUG(10,("regdb_store_values: Looking for value of key [%s] \n", key)); - if (!regdb_key_exists(key)) { + if (!regdb_key_exists(regdb, key)) { goto done; } @@ -1587,7 +1595,7 @@ static WERROR regdb_get_secdesc(TALLOC_CTX *mem_ctx, const char *key, DEBUG(10, ("regdb_get_secdesc: Getting secdesc of key [%s]\n", key)); - if (!regdb_key_exists(key)) { + if (!regdb_key_exists(regdb, key)) { err = WERR_BADFILE; goto done; } @@ -1627,7 +1635,7 @@ static WERROR regdb_set_secdesc(const char *key, WERROR err = WERR_NOMEM; TDB_DATA tdbdata; - if (!regdb_key_exists(key)) { + if (!regdb_key_exists(regdb, key)) { err = WERR_BADFILE; goto done; } -- cgit From eb1958ca3d6cd30e292d2d013ff1ea63e65563fb Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Tue, 7 Jul 2009 11:11:10 +0200 Subject: s3:registry: rename regdb_store_keys_internal() to regdb_store_keys_internal2() Michael --- source3/registry/reg_backend_db.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index efbd678437..c29bd79525 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -603,9 +603,9 @@ done: fstrings ***********************************************************************/ -static bool regdb_store_keys_internal(struct db_context *db, - const char *key, - struct regsubkey_ctr *ctr) +static bool regdb_store_keys_internal2(struct db_context *db, + const char *key, + struct regsubkey_ctr *ctr) { TDB_DATA dbuf; uint8 *buffer = NULL; @@ -824,7 +824,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr) /* (2) store the subkey list for the parent */ - if (!regdb_store_keys_internal(regdb, key, ctr)) { + if (!regdb_store_keys_internal2(regdb, key, ctr)) { DEBUG(0,("regdb_store_keys: Failed to store new subkey list " "for parent [%s]\n", key)); goto cancel; @@ -841,7 +841,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr) goto cancel; } - if (!regdb_store_keys_internal(regdb, key, subkeys)) { + if (!regdb_store_keys_internal2(regdb, key, subkeys)) { DEBUG(0,("regdb_store_keys: Failed to store " "new record for key [%s]\n", key)); goto cancel; @@ -865,7 +865,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr) if (regdb_fetch_keys_internal(regdb, path, subkeys) == -1) { /* create a record with 0 subkeys */ - if (!regdb_store_keys_internal(regdb, path, subkeys)) { + if (!regdb_store_keys_internal2(regdb, path, subkeys)) { DEBUG(0,("regdb_store_keys: Failed to store " "new record for key [%s]\n", path)); goto cancel; @@ -935,7 +935,7 @@ static WERROR regdb_create_subkey(const char *key, const char *subkey) werr = regsubkey_ctr_addkey(subkeys, subkey); W_ERROR_NOT_OK_GOTO(werr, cancel); - if (!regdb_store_keys_internal(regdb, key, subkeys)) { + if (!regdb_store_keys_internal2(regdb, key, subkeys)) { DEBUG(0, (__location__ " failed to store new subkey list for " "parent key %s\n", key)); werr = WERR_REG_IO_FAILURE; @@ -1002,7 +1002,7 @@ static WERROR regdb_delete_subkey(const char *key, const char *subkey) werr = regsubkey_ctr_delkey(subkeys, subkey); W_ERROR_NOT_OK_GOTO(werr, cancel); - if (!regdb_store_keys_internal(regdb, key, subkeys)) { + if (!regdb_store_keys_internal2(regdb, key, subkeys)) { DEBUG(0, (__location__ " failed to store new subkey_list for " "parent key %s\n", key)); werr = WERR_REG_IO_FAILURE; @@ -1097,7 +1097,7 @@ done: * parent_subkey_scanner. The code uses parse_record() to avoid a memcpy of * the potentially large subkey record. * - * The sorted subkey record is deleted in regdb_store_keys_internal and + * The sorted subkey record is deleted in regdb_store_keys_internal2 and * recreated on demand. */ -- cgit From 1dfaa371fa027351a0af6e56a04bc045c3b0dc73 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Tue, 7 Jul 2009 11:31:28 +0200 Subject: s3:registry: create regdb_store_keys_internal() with db_context argument and let exported regdb_store_keys() just call regdb_store_keys_internal() with regdb as an argument. Internally, in reg_backend_db.c, always use the _internal version. Michael --- source3/registry/reg_backend_db.c | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index c29bd79525..78ac64d5c1 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -31,6 +31,8 @@ static bool regdb_key_exists(struct db_context *db, const char *key); static bool regdb_key_is_base_key(const char *key); static int regdb_fetch_keys_internal(struct db_context *db, const char *key, struct regsubkey_ctr *ctr); +static bool regdb_store_keys_internal(struct db_context *db, const char *key, + struct regsubkey_ctr *ctr); /* List the deepest path into the registry. All part components will be created.*/ @@ -182,7 +184,7 @@ static WERROR init_registry_key_internal(const char *add_path) goto fail; } } - if (!regdb_store_keys( base, subkeys)) { + if (!regdb_store_keys_internal(regdb, base, subkeys)) { werr = WERR_CAN_NOT_COMPLETE; goto fail; } @@ -706,7 +708,8 @@ done: do not currently exist ***********************************************************************/ -bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr) +static bool regdb_store_keys_internal(struct db_context *db, const char *key, + struct regsubkey_ctr *ctr) { int num_subkeys, old_num_subkeys, i; char *path = NULL; @@ -715,7 +718,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr) TALLOC_CTX *ctx = talloc_stackframe(); WERROR werr; - if (!regdb_key_is_base_key(key) && !regdb_key_exists(regdb, key)) { + if (!regdb_key_is_base_key(key) && !regdb_key_exists(db, key)) { goto fail; } @@ -730,7 +733,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr) return false; } - regdb_fetch_keys_internal(regdb, key, old_subkeys); + regdb_fetch_keys_internal(db, key, old_subkeys); num_subkeys = regsubkey_ctr_numkeys(ctr); old_num_subkeys = regsubkey_ctr_numkeys(old_subkeys); @@ -757,7 +760,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr) TALLOC_FREE(old_subkeys); - if (regdb->transaction_start(regdb) != 0) { + if (db->transaction_start(db) != 0) { DEBUG(0, ("regdb_store_keys: transaction_start failed\n")); goto fail; } @@ -772,7 +775,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr) goto cancel; } - regdb_fetch_keys_internal(regdb, key, old_subkeys); + regdb_fetch_keys_internal(db, key, old_subkeys); /* * Make the store operation as safe as possible without transactions: @@ -814,7 +817,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr) goto cancel; } - werr = regdb_delete_key_lists(regdb, path); + werr = regdb_delete_key_lists(db, path); W_ERROR_NOT_OK_GOTO(werr, cancel); TALLOC_FREE(path); @@ -824,7 +827,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr) /* (2) store the subkey list for the parent */ - if (!regdb_store_keys_internal2(regdb, key, ctr)) { + if (!regdb_store_keys_internal2(db, key, ctr)) { DEBUG(0,("regdb_store_keys: Failed to store new subkey list " "for parent [%s]\n", key)); goto cancel; @@ -841,7 +844,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr) goto cancel; } - if (!regdb_store_keys_internal2(regdb, key, subkeys)) { + if (!regdb_store_keys_internal2(db, key, subkeys)) { DEBUG(0,("regdb_store_keys: Failed to store " "new record for key [%s]\n", key)); goto cancel; @@ -863,9 +866,9 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr) goto cancel; } - if (regdb_fetch_keys_internal(regdb, path, subkeys) == -1) { + if (regdb_fetch_keys_internal(db, path, subkeys) == -1) { /* create a record with 0 subkeys */ - if (!regdb_store_keys_internal2(regdb, path, subkeys)) { + if (!regdb_store_keys_internal2(db, path, subkeys)) { DEBUG(0,("regdb_store_keys: Failed to store " "new record for key [%s]\n", path)); goto cancel; @@ -876,7 +879,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr) TALLOC_FREE(path); } - if (regdb->transaction_commit(regdb) != 0) { + if (db->transaction_commit(db) != 0) { DEBUG(0, ("regdb_store_keys: Could not commit transaction\n")); goto fail; } @@ -885,7 +888,7 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr) return true; cancel: - if (regdb->transaction_cancel(regdb) != 0) { + if (db->transaction_cancel(db) != 0) { smb_panic("regdb_store_keys: transaction_cancel failed\n"); } @@ -895,6 +898,11 @@ fail: return false; } +bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr) +{ + return regdb_store_keys_internal(regdb, key, ctr); +} + static WERROR regdb_create_subkey(const char *key, const char *subkey) { WERROR werr; -- cgit From 3409a44da2ee6a0ca2caaf0455e0095f8e2f80a4 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Tue, 7 Jul 2009 11:41:08 +0200 Subject: s3:registry: don't use exported transaction wrappers in regdb_create_subkey() So that the regdb handle is again explicit and the core of the function can be abstracted. Michael --- source3/registry/reg_backend_db.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 78ac64d5c1..6763558b0d 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -929,8 +929,10 @@ static WERROR regdb_create_subkey(const char *key, const char *subkey) talloc_free(subkeys); - werr = regdb_transaction_start(); - W_ERROR_NOT_OK_GOTO_DONE(werr); + if (regdb->transaction_start(regdb) != 0) { + werr = WERR_REG_IO_FAILURE; + goto done; + } werr = regsubkey_ctr_init(mem_ctx, &subkeys); W_ERROR_NOT_OK_GOTO(werr, cancel); @@ -950,19 +952,17 @@ static WERROR regdb_create_subkey(const char *key, const char *subkey) goto cancel; } - werr = regdb_transaction_commit(); - if (!W_ERROR_IS_OK(werr)) { - DEBUG(0, (__location__ " failed to commit transaction: %s\n", - win_errstr(werr))); + if (regdb->transaction_commit(regdb) != 0) { + werr = WERR_REG_IO_FAILURE; + DEBUG(0, (__location__ " failed to commit transaction\n")); } goto done; cancel: - werr = regdb_transaction_cancel(); - if (!W_ERROR_IS_OK(werr)) { - DEBUG(0, (__location__ " failed to cancel transaction: %s\n", - win_errstr(werr))); + if (regdb->transaction_cancel(regdb) != 0) { + werr = WERR_REG_IO_FAILURE; + DEBUG(0, (__location__ " failed to cancel transaction\n")); } done: -- cgit From 355892c296f7f245e5a5dd9070e3e776bedbf09c Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Tue, 7 Jul 2009 12:20:23 +0200 Subject: s3:registry: panic upon failed transaction_cancel in regdb_create_subkey() Michael --- source3/registry/reg_backend_db.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 6763558b0d..880c84a1be 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -961,8 +961,7 @@ static WERROR regdb_create_subkey(const char *key, const char *subkey) cancel: if (regdb->transaction_cancel(regdb) != 0) { - werr = WERR_REG_IO_FAILURE; - DEBUG(0, (__location__ " failed to cancel transaction\n")); + smb_panic("regdb_create_subkey: transaction_cancel failed\n"); } done: -- cgit From 4eeacd6ef0e1bb813062c30ac280e542c6b007c8 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Tue, 7 Jul 2009 12:24:25 +0200 Subject: s3:registry: in regdb_delete_subkey(), panic if transaction_cancel fails Michael --- source3/registry/reg_backend_db.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 880c84a1be..0c916a8df6 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -1027,8 +1027,7 @@ static WERROR regdb_delete_subkey(const char *key, const char *subkey) cancel: werr2 = regdb_transaction_cancel(); if (!W_ERROR_IS_OK(werr2)) { - DEBUG(0, (__location__ " failed to cancel transaction: %s\n", - win_errstr(werr2))); + smb_panic("regdb_delete_subkey: transaction_cancel failed\n"); } done: -- cgit From 6cb14409af5f708706f975143c7b40bb54c7a5c0 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Tue, 7 Jul 2009 12:27:26 +0200 Subject: s3:registry: in regdb_delete_subkey(), don't use the transaction wrappers. This way, the db handle gets used explicitly and the core of the function can be abstracted. Michael --- source3/registry/reg_backend_db.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 0c916a8df6..979dc1867c 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -971,7 +971,7 @@ done: static WERROR regdb_delete_subkey(const char *key, const char *subkey) { - WERROR werr, werr2; + WERROR werr; struct regsubkey_ctr *subkeys; char *path; TALLOC_CTX *mem_ctx = talloc_stackframe(); @@ -992,8 +992,10 @@ static WERROR regdb_delete_subkey(const char *key, const char *subkey) goto done; } - werr = regdb_transaction_start(); - W_ERROR_NOT_OK_GOTO_DONE(werr); + if (regdb->transaction_start(regdb) != 0) { + werr = WERR_REG_IO_FAILURE; + goto done; + } werr = regdb_delete_key_lists(regdb, path); W_ERROR_NOT_OK_GOTO(werr, cancel); @@ -1016,17 +1018,15 @@ static WERROR regdb_delete_subkey(const char *key, const char *subkey) goto cancel; } - werr = regdb_transaction_commit(); - if (!W_ERROR_IS_OK(werr)) { - DEBUG(0, (__location__ " failed to commit transaction: %s\n", - win_errstr(werr))); + if (regdb->transaction_commit(regdb) != 0) { + DEBUG(0, (__location__ " failed to commit transaction\n")); + werr = WERR_REG_IO_FAILURE; } goto done; cancel: - werr2 = regdb_transaction_cancel(); - if (!W_ERROR_IS_OK(werr2)) { + if (regdb->transaction_cancel(regdb) != 0) { smb_panic("regdb_delete_subkey: transaction_cancel failed\n"); } -- cgit From 4c366a094693f050b2cadea771cd5c6eab29e278 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Tue, 7 Jul 2009 12:39:32 +0200 Subject: s3:registry: don't loop transaction_commit in create_sorted_subkeys() upon error This would try to commit a higher level transaction upon commit-error. Michael --- source3/registry/reg_backend_db.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 979dc1867c..dd9ca8b65c 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -1203,7 +1203,7 @@ static bool create_sorted_subkeys(const char *key, const char *sorted_keyname) if (regdb->transaction_commit(regdb) == -1) { DEBUG(0, ("create_sorted_subkeys: transaction_start " "failed\n")); - goto fail; + result = false; } TALLOC_FREE(ctr); -- cgit From 3189828087387686f63b3ae0b289c6e31f602a54 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Tue, 7 Jul 2009 12:41:09 +0200 Subject: s3:registry: fix a comment in create_sorted_subkeys() Michael --- source3/registry/reg_backend_db.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index dd9ca8b65c..245e14b6d4 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -1201,7 +1201,7 @@ static bool create_sorted_subkeys(const char *key, const char *sorted_keyname) * a transaction_commit for transactions that we might be wrapped in. */ if (regdb->transaction_commit(regdb) == -1) { - DEBUG(0, ("create_sorted_subkeys: transaction_start " + DEBUG(0, ("create_sorted_subkeys: transaction_commit " "failed\n")); result = false; } -- cgit From a00109e1e6c1063b560be85c43ef820d3446ae31 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Tue, 7 Jul 2009 12:42:09 +0200 Subject: s3:registry: panic upon error at transaction_cancel in create_sorted_subkeys Michael --- source3/registry/reg_backend_db.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 245e14b6d4..8806a93735 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -1184,8 +1184,8 @@ static bool create_sorted_subkeys(const char *key, const char *sorted_keyname) * transaction. See below for an explanation. */ if (regdb->transaction_cancel(regdb) == -1) { - DEBUG(0, ("create_sorted_subkeys: transaction_cancel " - "failed\n")); + smb_panic("create_sorted_subkeys: transaction_cancel " + "failed\n"); } TALLOC_FREE(ctr); return false; -- cgit From 95ebf534d2bc9904cc7c02bccdf5c01cc595ad7c Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Tue, 7 Jul 2009 23:03:46 +0200 Subject: s3:registry: add db_context argument to init_registry_key_internal() Michael --- source3/registry/reg_backend_db.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 8806a93735..d19eac3ccd 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -98,7 +98,8 @@ static struct builtin_regkey_value builtin_registry_values[] = { * Initialize a key in the registry: * create each component key of the specified path. */ -static WERROR init_registry_key_internal(const char *add_path) +static WERROR init_registry_key_internal(struct db_context *db, + const char *add_path) { WERROR werr; TALLOC_CTX *frame = talloc_stackframe(); @@ -177,14 +178,14 @@ static WERROR init_registry_key_internal(const char *add_path) goto fail; } - regdb_fetch_keys_internal(regdb, base, subkeys); + regdb_fetch_keys_internal(db, base, subkeys); if (*subkeyname) { werr = regsubkey_ctr_addkey(subkeys, subkeyname); if (!W_ERROR_IS_OK(werr)) { goto fail; } } - if (!regdb_store_keys_internal(regdb, base, subkeys)) { + if (!regdb_store_keys_internal(db, base, subkeys)) { werr = WERR_CAN_NOT_COMPLETE; goto fail; } @@ -215,7 +216,7 @@ WERROR init_registry_key(const char *add_path) return WERR_REG_IO_FAILURE; } - werr = init_registry_key_internal(add_path); + werr = init_registry_key_internal(regdb, add_path); if (!W_ERROR_IS_OK(werr)) { goto fail; } @@ -301,7 +302,8 @@ do_init: if (regdb_key_exists(regdb, builtin_registry_paths[i])) { continue; } - werr = init_registry_key_internal(builtin_registry_paths[i]); + werr = init_registry_key_internal(regdb, + builtin_registry_paths[i]); if (!W_ERROR_IS_OK(werr)) { goto fail; } -- cgit From 8a5b164b20c3d51df2422c1402ef31384b31472e Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Tue, 7 Jul 2009 23:58:03 +0200 Subject: s3:registry: use transaction wrapper in init_registry_key(). Michael --- source3/registry/reg_backend_db.c | 42 ++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 23 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index d19eac3ccd..74671a0790 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -198,6 +198,20 @@ fail: return werr; } +struct init_registry_key_context { + const char *add_path; +}; + +static NTSTATUS init_registry_key_action(struct db_context *db, + void *private_data) +{ + struct init_registry_key_context *init_ctx = + (struct init_registry_key_context *)private_data; + + return werror_to_ntstatus(init_registry_key_internal( + db, init_ctx->add_path)); +} + /** * Initialize a key in the registry: * create each component key of the specified path, @@ -205,35 +219,17 @@ fail: */ WERROR init_registry_key(const char *add_path) { - WERROR werr; + struct init_registry_key_context init_ctx; if (regdb_key_exists(regdb, add_path)) { return WERR_OK; } - if (regdb->transaction_start(regdb) != 0) { - DEBUG(0, ("init_registry_key: transaction_start failed\n")); - return WERR_REG_IO_FAILURE; - } + init_ctx.add_path = add_path; - werr = init_registry_key_internal(regdb, add_path); - if (!W_ERROR_IS_OK(werr)) { - goto fail; - } - - if (regdb->transaction_commit(regdb) != 0) { - DEBUG(0, ("init_registry_key: Could not commit transaction\n")); - return WERR_REG_IO_FAILURE; - } - - return WERR_OK; - -fail: - if (regdb->transaction_cancel(regdb) != 0) { - smb_panic("init_registry_key: transaction_cancel failed\n"); - } - - return werr; + return ntstatus_to_werror(dbwrap_trans_do(regdb, + init_registry_key_action, + &init_ctx)); } /*********************************************************************** -- cgit From 302265aae1bc27244ffaa9d803a8be83947e0381 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Wed, 8 Jul 2009 12:32:48 +0200 Subject: s3:registry: add a regdb_fetch_values_internal() that takes a db_context argument Michael --- source3/registry/reg_backend_db.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 74671a0790..a5e882e9dc 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -33,6 +33,8 @@ static int regdb_fetch_keys_internal(struct db_context *db, const char *key, struct regsubkey_ctr *ctr); static bool regdb_store_keys_internal(struct db_context *db, const char *key, struct regsubkey_ctr *ctr); +static int regdb_fetch_values_internal(struct db_context *db, const char* key, + struct regval_ctr *values); /* List the deepest path into the registry. All part components will be created.*/ @@ -261,7 +263,9 @@ WERROR init_registry_data(void) goto done; } - regdb_fetch_values(builtin_registry_values[i].path, values); + regdb_fetch_values_internal(regdb, + builtin_registry_values[i].path, + values); if (!regval_ctr_key_exists(values, builtin_registry_values[i].valuename)) { @@ -315,7 +319,9 @@ do_init: goto fail; } - regdb_fetch_values(builtin_registry_values[i].path, values); + regdb_fetch_values_internal(regdb, + builtin_registry_values[i].path, + values); /* preserve existing values across restarts. Only add new ones */ @@ -1495,7 +1501,8 @@ static int regdb_pack_values(struct regval_ctr *values, uint8 *buf, int buflen) released by the caller. ***********************************************************************/ -int regdb_fetch_values(const char* key, struct regval_ctr *values) +static int regdb_fetch_values_internal(struct db_context *db, const char* key, + struct regval_ctr *values) { char *keystr = NULL; TALLOC_CTX *ctx = talloc_stackframe(); @@ -1504,7 +1511,7 @@ int regdb_fetch_values(const char* key, struct regval_ctr *values) DEBUG(10,("regdb_fetch_values: Looking for value of key [%s] \n", key)); - if (!regdb_key_exists(regdb, key)) { + if (!regdb_key_exists(db, key)) { goto done; } @@ -1513,9 +1520,9 @@ int regdb_fetch_values(const char* key, struct regval_ctr *values) goto done; } - values->seqnum = regdb_get_seqnum(); + values->seqnum = db->get_seqnum(db); - value = regdb_fetch_key_internal(regdb, ctx, keystr); + value = regdb_fetch_key_internal(db, ctx, keystr); if (!value.dptr) { /* all keys have zero values by default */ @@ -1530,6 +1537,11 @@ done: return ret; } +int regdb_fetch_values(const char* key, struct regval_ctr *values) +{ + return regdb_fetch_values_internal(regdb, key, values); +} + bool regdb_store_values(const char *key, struct regval_ctr *values) { TDB_DATA old_data, data; -- cgit From e6340963cf549cda261fc1ba9da4bc1b3a071241 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Wed, 8 Jul 2009 12:38:41 +0200 Subject: s3:registry: add regdb_store_values_internal() that takes a db_context argument Michael --- source3/registry/reg_backend_db.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index a5e882e9dc..d2adc1ce08 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -35,6 +35,8 @@ static bool regdb_store_keys_internal(struct db_context *db, const char *key, struct regsubkey_ctr *ctr); static int regdb_fetch_values_internal(struct db_context *db, const char* key, struct regval_ctr *values); +static bool regdb_store_values_internal(struct db_context *db, const char *key, + struct regval_ctr *values); /* List the deepest path into the registry. All part components will be created.*/ @@ -354,8 +356,9 @@ do_init: "[%d]\n", builtin_registry_values[i].type)); } - regdb_store_values(builtin_registry_values[i].path, - values); + regdb_store_values_internal(regdb, + builtin_registry_values[i].path, + values); } TALLOC_FREE(values); } @@ -1542,7 +1545,8 @@ int regdb_fetch_values(const char* key, struct regval_ctr *values) return regdb_fetch_values_internal(regdb, key, values); } -bool regdb_store_values(const char *key, struct regval_ctr *values) +static bool regdb_store_values_internal(struct db_context *db, const char *key, + struct regval_ctr *values) { TDB_DATA old_data, data; char *keystr = NULL; @@ -1553,7 +1557,7 @@ bool regdb_store_values(const char *key, struct regval_ctr *values) DEBUG(10,("regdb_store_values: Looking for value of key [%s] \n", key)); - if (!regdb_key_exists(regdb, key)) { + if (!regdb_key_exists(db, key)) { goto done; } @@ -1581,7 +1585,7 @@ bool regdb_store_values(const char *key, struct regval_ctr *values) goto done; } - old_data = dbwrap_fetch_bystring(regdb, ctx, keystr); + old_data = dbwrap_fetch_bystring(db, ctx, keystr); if ((old_data.dptr != NULL) && (old_data.dsize == data.dsize) @@ -1591,7 +1595,7 @@ bool regdb_store_values(const char *key, struct regval_ctr *values) goto done; } - status = dbwrap_trans_store_bystring(regdb, keystr, data, TDB_REPLACE); + status = dbwrap_trans_store_bystring(db, keystr, data, TDB_REPLACE); result = NT_STATUS_IS_OK(status); @@ -1600,6 +1604,11 @@ done: return result; } +bool regdb_store_values(const char *key, struct regval_ctr *values) +{ + return regdb_store_values_internal(regdb, key, values); +} + static WERROR regdb_get_secdesc(TALLOC_CTX *mem_ctx, const char *key, struct security_descriptor **psecdesc) { -- cgit From cf4f808b8b03c385b5b9e9f4a5e891ae92143001 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Wed, 8 Jul 2009 13:10:37 +0200 Subject: s3:registry: use transaction wrapper in init_registry_data() Michael --- source3/registry/reg_backend_db.c | 141 +++++++++++++++++++------------------- 1 file changed, 69 insertions(+), 72 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index d2adc1ce08..bed9535f17 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -240,74 +240,25 @@ WERROR init_registry_key(const char *add_path) Open the registry data in the tdb ***********************************************************************/ -WERROR init_registry_data(void) +static NTSTATUS init_registry_data_action(struct db_context *db, + void *private_data) { - WERROR werr; + NTSTATUS status; TALLOC_CTX *frame = talloc_stackframe(); struct regval_ctr *values; int i; UNISTR2 data; - /* - * First, check for the existence of the needed keys and values. - * If all do already exist, we can save the writes. - */ - for (i=0; builtin_registry_paths[i] != NULL; i++) { - if (!regdb_key_exists(regdb, builtin_registry_paths[i])) { - goto do_init; - } - } - - for (i=0; builtin_registry_values[i].path != NULL; i++) { - values = TALLOC_ZERO_P(frame, struct regval_ctr); - if (values == NULL) { - werr = WERR_NOMEM; - goto done; - } - - regdb_fetch_values_internal(regdb, - builtin_registry_values[i].path, - values); - if (!regval_ctr_key_exists(values, - builtin_registry_values[i].valuename)) - { - TALLOC_FREE(values); - goto do_init; - } - - TALLOC_FREE(values); - } - - werr = WERR_OK; - goto done; - -do_init: - - /* - * There are potentially quite a few store operations which are all - * indiviually wrapped in tdb transactions. Wrapping them in a single - * transaction gives just a single transaction_commit() to actually do - * its fsync()s. See tdb/common/transaction.c for info about nested - * transaction behaviour. - */ - - if (regdb->transaction_start(regdb) != 0) { - DEBUG(0, ("init_registry_data: tdb_transaction_start " - "failed\n")); - werr = WERR_REG_IO_FAILURE; - goto done; - } - /* loop over all of the predefined paths and add each component */ for (i=0; builtin_registry_paths[i] != NULL; i++) { - if (regdb_key_exists(regdb, builtin_registry_paths[i])) { + if (regdb_key_exists(db, builtin_registry_paths[i])) { continue; } - werr = init_registry_key_internal(regdb, - builtin_registry_paths[i]); - if (!W_ERROR_IS_OK(werr)) { - goto fail; + status = werror_to_ntstatus(init_registry_key_internal(db, + builtin_registry_paths[i])); + if (!NT_STATUS_IS_OK(status)) { + goto done; } } @@ -317,11 +268,11 @@ do_init: values = TALLOC_ZERO_P(frame, struct regval_ctr); if (values == NULL) { - werr = WERR_NOMEM; - goto fail; + status = NT_STATUS_NO_MEMORY; + goto done; } - regdb_fetch_values_internal(regdb, + regdb_fetch_values_internal(db, builtin_registry_values[i].path, values); @@ -356,29 +307,75 @@ do_init: "[%d]\n", builtin_registry_values[i].type)); } - regdb_store_values_internal(regdb, + regdb_store_values_internal(db, builtin_registry_values[i].path, values); } TALLOC_FREE(values); } - if (regdb->transaction_commit(regdb) != 0) { - DEBUG(0, ("init_registry_data: Could not commit " - "transaction\n")); - werr = WERR_REG_IO_FAILURE; - } else { - werr = WERR_OK; + status = NT_STATUS_OK; + +done: + + TALLOC_FREE(frame); + return status; +} + +WERROR init_registry_data(void) +{ + WERROR werr; + TALLOC_CTX *frame = talloc_stackframe(); + struct regval_ctr *values; + int i; + + /* + * First, check for the existence of the needed keys and values. + * If all do already exist, we can save the writes. + */ + for (i=0; builtin_registry_paths[i] != NULL; i++) { + if (!regdb_key_exists(regdb, builtin_registry_paths[i])) { + goto do_init; + } } - goto done; + for (i=0; builtin_registry_values[i].path != NULL; i++) { + values = TALLOC_ZERO_P(frame, struct regval_ctr); + if (values == NULL) { + werr = WERR_NOMEM; + goto done; + } -fail: - if (regdb->transaction_cancel(regdb) != 0) { - smb_panic("init_registry_data: tdb_transaction_cancel " - "failed\n"); + regdb_fetch_values_internal(regdb, + builtin_registry_values[i].path, + values); + if (!regval_ctr_key_exists(values, + builtin_registry_values[i].valuename)) + { + TALLOC_FREE(values); + goto do_init; + } + + TALLOC_FREE(values); } + werr = WERR_OK; + goto done; + +do_init: + + /* + * There are potentially quite a few store operations which are all + * indiviually wrapped in tdb transactions. Wrapping them in a single + * transaction gives just a single transaction_commit() to actually do + * its fsync()s. See tdb/common/transaction.c for info about nested + * transaction behaviour. + */ + + werr = ntstatus_to_werror(dbwrap_trans_do(regdb, + init_registry_data_action, + NULL)); + done: TALLOC_FREE(frame); return werr; -- cgit From 1c65c98f3350951fe9f87a942b4c8a8094c8b781 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Wed, 8 Jul 2009 13:58:52 +0200 Subject: s3:registry: refactor adding of builtin reg values out into regdb_ctr_add_value(). For readability. Michael --- source3/registry/reg_backend_db.c | 54 +++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 27 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index bed9535f17..d04d34bac0 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -240,6 +240,31 @@ WERROR init_registry_key(const char *add_path) Open the registry data in the tdb ***********************************************************************/ +static void regdb_ctr_add_value(struct regval_ctr *ctr, + struct builtin_regkey_value *value) +{ + UNISTR2 data; + + switch(value->type) { + case REG_DWORD: + regval_ctr_addvalue(ctr, value->valuename, REG_DWORD, + (char*)&value->data.dw_value, + sizeof(uint32)); + break; + + case REG_SZ: + init_unistr2(&data, value->data.string, UNI_STR_TERMINATE); + regval_ctr_addvalue(ctr, value->valuename, REG_SZ, + (char*)data.buffer, + data.uni_str_len*sizeof(uint16)); + break; + + default: + DEBUG(0, ("regdb_ctr_add_value: invalid value type in " + "registry values [%d]\n", value->type)); + } +} + static NTSTATUS init_registry_data_action(struct db_context *db, void *private_data) { @@ -247,7 +272,6 @@ static NTSTATUS init_registry_data_action(struct db_context *db, TALLOC_CTX *frame = talloc_stackframe(); struct regval_ctr *values; int i; - UNISTR2 data; /* loop over all of the predefined paths and add each component */ @@ -281,32 +305,8 @@ static NTSTATUS init_registry_data_action(struct db_context *db, if (!regval_ctr_key_exists(values, builtin_registry_values[i].valuename)) { - switch(builtin_registry_values[i].type) { - case REG_DWORD: - regval_ctr_addvalue(values, - builtin_registry_values[i].valuename, - REG_DWORD, - (char*)&builtin_registry_values[i].data.dw_value, - sizeof(uint32)); - break; - - case REG_SZ: - init_unistr2(&data, - builtin_registry_values[i].data.string, - UNI_STR_TERMINATE); - regval_ctr_addvalue(values, - builtin_registry_values[i].valuename, - REG_SZ, - (char*)data.buffer, - data.uni_str_len*sizeof(uint16)); - break; - - default: - DEBUG(0, ("init_registry_data: invalid value " - "type in builtin_registry_values " - "[%d]\n", - builtin_registry_values[i].type)); - } + regdb_ctr_add_value(values, + &builtin_registry_values[i]); regdb_store_values_internal(db, builtin_registry_values[i].path, values); -- cgit From 14f593aa0f43127ab78aec848b0fe5933c0c28c9 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Wed, 8 Jul 2009 17:26:06 +0200 Subject: s3:registry: change regdb_store_keys_internal2() to return WERROR instead of bool for better error propagation. Michael --- source3/registry/reg_backend_db.c | 71 ++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 30 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index d04d34bac0..419bfd00f5 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -609,27 +609,26 @@ done: fstrings ***********************************************************************/ -static bool regdb_store_keys_internal2(struct db_context *db, - const char *key, - struct regsubkey_ctr *ctr) +static WERROR regdb_store_keys_internal2(struct db_context *db, + const char *key, + struct regsubkey_ctr *ctr) { TDB_DATA dbuf; uint8 *buffer = NULL; int i = 0; uint32 len, buflen; - bool ret = true; uint32 num_subkeys = regsubkey_ctr_numkeys(ctr); char *keyname = NULL; TALLOC_CTX *ctx = talloc_stackframe(); - NTSTATUS status; + WERROR werr; if (!key) { - return false; + return WERR_INVALID_PARAM; } keyname = talloc_strdup(ctx, key); if (!keyname) { - return false; + return WERR_NOMEM; } keyname = normalize_reg_path(ctx, keyname); @@ -637,7 +636,8 @@ static bool regdb_store_keys_internal2(struct db_context *db, buffer = (uint8 *)SMB_MALLOC(1024); if (buffer == NULL) { - return false; + werr = WERR_NOMEM; + goto done; } buflen = 1024; len = 0; @@ -665,7 +665,7 @@ static bool regdb_store_keys_internal2(struct db_context *db, DEBUG(0, ("regdb_store_keys: Failed to realloc " "memory of size [%u]\n", (unsigned int)(len+thistime)*2)); - ret = false; + werr = WERR_NOMEM; goto done; } buflen = (len+thistime)*2; @@ -674,7 +674,7 @@ static bool regdb_store_keys_internal2(struct db_context *db, regsubkey_ctr_specific_key(ctr, i)); if (thistime2 != thistime) { DEBUG(0, ("tdb_pack failed\n")); - ret = false; + werr = WERR_CAN_NOT_COMPLETE; goto done; } } @@ -685,11 +685,9 @@ static bool regdb_store_keys_internal2(struct db_context *db, dbuf.dptr = buffer; dbuf.dsize = len; - status = dbwrap_store_bystring(db, keyname, dbuf, TDB_REPLACE); - if (!NT_STATUS_IS_OK(status)) { - ret = false; - goto done; - } + werr = ntstatus_to_werror(dbwrap_store_bystring(db, keyname, dbuf, + TDB_REPLACE)); + W_ERROR_NOT_OK_GOTO_DONE(werr); /* * Delete a sorted subkey cache for regdb_key_exists, will be @@ -697,14 +695,22 @@ static bool regdb_store_keys_internal2(struct db_context *db, */ keyname = talloc_asprintf(ctx, "%s/%s", REG_SORTED_SUBKEYS_PREFIX, keyname); - if (keyname != NULL) { - dbwrap_delete_bystring(db, keyname); + if (keyname == NULL) { + werr = WERR_NOMEM; + goto done; + } + + werr = ntstatus_to_werror(dbwrap_delete_bystring(db, keyname)); + + /* don't treat WERR_NOT_FOUND as an error here */ + if (W_ERROR_EQUAL(werr, WERR_NOT_FOUND)) { + werr = WERR_OK; } done: TALLOC_FREE(ctx); SAFE_FREE(buffer); - return ret; + return werr; } /*********************************************************************** @@ -831,9 +837,10 @@ static bool regdb_store_keys_internal(struct db_context *db, const char *key, /* (2) store the subkey list for the parent */ - if (!regdb_store_keys_internal2(db, key, ctr)) { + werr = regdb_store_keys_internal2(db, key, ctr); + if (!W_ERROR_IS_OK(werr)) { DEBUG(0,("regdb_store_keys: Failed to store new subkey list " - "for parent [%s]\n", key)); + "for parent [%s]: %s\n", key, win_errstr(werr))); goto cancel; } @@ -848,9 +855,11 @@ static bool regdb_store_keys_internal(struct db_context *db, const char *key, goto cancel; } - if (!regdb_store_keys_internal2(db, key, subkeys)) { + werr = regdb_store_keys_internal2(db, key, subkeys); + if (!W_ERROR_IS_OK(werr)) { DEBUG(0,("regdb_store_keys: Failed to store " - "new record for key [%s]\n", key)); + "new record for key [%s]: %s\n", key, + win_errstr(werr))); goto cancel; } TALLOC_FREE(subkeys); @@ -872,9 +881,11 @@ static bool regdb_store_keys_internal(struct db_context *db, const char *key, if (regdb_fetch_keys_internal(db, path, subkeys) == -1) { /* create a record with 0 subkeys */ - if (!regdb_store_keys_internal2(db, path, subkeys)) { + werr = regdb_store_keys_internal2(db, path, subkeys); + if (!W_ERROR_IS_OK(werr)) { DEBUG(0,("regdb_store_keys: Failed to store " - "new record for key [%s]\n", path)); + "new record for key [%s]: %s\n", path, + win_errstr(werr))); goto cancel; } } @@ -949,10 +960,10 @@ static WERROR regdb_create_subkey(const char *key, const char *subkey) werr = regsubkey_ctr_addkey(subkeys, subkey); W_ERROR_NOT_OK_GOTO(werr, cancel); - if (!regdb_store_keys_internal2(regdb, key, subkeys)) { + werr = regdb_store_keys_internal2(regdb, key, subkeys); + if (!W_ERROR_IS_OK(werr)) { DEBUG(0, (__location__ " failed to store new subkey list for " - "parent key %s\n", key)); - werr = WERR_REG_IO_FAILURE; + "parent key %s: %s\n", key, win_errstr(werr))); goto cancel; } @@ -1015,10 +1026,10 @@ static WERROR regdb_delete_subkey(const char *key, const char *subkey) werr = regsubkey_ctr_delkey(subkeys, subkey); W_ERROR_NOT_OK_GOTO(werr, cancel); - if (!regdb_store_keys_internal2(regdb, key, subkeys)) { + werr = regdb_store_keys_internal2(regdb, key, subkeys); + if (!W_ERROR_IS_OK(werr)) { DEBUG(0, (__location__ " failed to store new subkey_list for " - "parent key %s\n", key)); - werr = WERR_REG_IO_FAILURE; + "parent key %s: %s\n", key, win_errstr(werr))); goto cancel; } -- cgit From 3eec829e2fa2106c8d52f31e3f3d7f45e6c81b24 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Thu, 9 Jul 2009 00:10:08 +0200 Subject: s3:registry: unify exit logic and remove leaking to talloc_stack in regdb_store_keys_internal() Michael --- source3/registry/reg_backend_db.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 419bfd00f5..542f6dc7d0 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -727,9 +727,10 @@ static bool regdb_store_keys_internal(struct db_context *db, const char *key, char *oldkeyname = NULL; TALLOC_CTX *ctx = talloc_stackframe(); WERROR werr; + bool ret = false; if (!regdb_key_is_base_key(key) && !regdb_key_exists(db, key)) { - goto fail; + goto done; } /* @@ -740,7 +741,7 @@ static bool regdb_store_keys_internal(struct db_context *db, const char *key, werr = regsubkey_ctr_init(ctx, &old_subkeys); if (!W_ERROR_IS_OK(werr)) { DEBUG(0,("regdb_store_keys: talloc() failure!\n")); - return false; + goto done; } regdb_fetch_keys_internal(db, key, old_subkeys); @@ -763,8 +764,9 @@ static bool regdb_store_keys_internal(struct db_context *db, const char *key, * Nothing changed, no point to even start a tdb * transaction */ - TALLOC_FREE(old_subkeys); - return true; + + ret = true; + goto done; } } @@ -772,7 +774,7 @@ static bool regdb_store_keys_internal(struct db_context *db, const char *key, if (db->transaction_start(db) != 0) { DEBUG(0, ("regdb_store_keys: transaction_start failed\n")); - goto fail; + goto done; } /* @@ -896,21 +898,22 @@ static bool regdb_store_keys_internal(struct db_context *db, const char *key, if (db->transaction_commit(db) != 0) { DEBUG(0, ("regdb_store_keys: Could not commit transaction\n")); - goto fail; + goto done; } - TALLOC_FREE(ctx); - return true; + ret = true; + goto done; cancel: + ret = false; if (db->transaction_cancel(db) != 0) { smb_panic("regdb_store_keys: transaction_cancel failed\n"); } -fail: +done: TALLOC_FREE(ctx); - return false; + return ret; } bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr) -- cgit From f93c9e0d415b5c2e2fd73bb370db7b7e17ede9aa Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Thu, 9 Jul 2009 00:21:46 +0200 Subject: s3:registry: don't leak to talloc_stack in regdb_store_keys_internal2() and catch one potential talloc failure. Michael --- source3/registry/reg_backend_db.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 542f6dc7d0..6bf98d4c75 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -623,14 +623,21 @@ static WERROR regdb_store_keys_internal2(struct db_context *db, WERROR werr; if (!key) { - return WERR_INVALID_PARAM; + werr = WERR_INVALID_PARAM; + goto done; } keyname = talloc_strdup(ctx, key); if (!keyname) { - return WERR_NOMEM; + werr = WERR_NOMEM; + goto done; } + keyname = normalize_reg_path(ctx, keyname); + if (!keyname) { + werr = WERR_NOMEM; + goto done; + } /* allocate some initial memory */ -- cgit From 86d747e19f877c45ac32663ec2a3381ad03cdcf5 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Thu, 9 Jul 2009 10:28:29 +0200 Subject: s3:registry: use transaction wrapper in regdb_store_keys_internal(). Michael --- source3/registry/reg_backend_db.c | 198 ++++++++++++++++++++------------------ 1 file changed, 102 insertions(+), 96 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 6bf98d4c75..5c714a40b4 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -725,76 +725,32 @@ done: do not currently exist ***********************************************************************/ -static bool regdb_store_keys_internal(struct db_context *db, const char *key, - struct regsubkey_ctr *ctr) +struct regdb_store_keys_context { + const char *key; + struct regsubkey_ctr *ctr; +}; + +static NTSTATUS regdb_store_keys_action(struct db_context *db, + void *private_data) { - int num_subkeys, old_num_subkeys, i; + struct regdb_store_keys_context *store_ctx; + WERROR werr; + int num_subkeys, i; char *path = NULL; struct regsubkey_ctr *subkeys = NULL, *old_subkeys = NULL; char *oldkeyname = NULL; - TALLOC_CTX *ctx = talloc_stackframe(); - WERROR werr; - bool ret = false; - - if (!regdb_key_is_base_key(key) && !regdb_key_exists(db, key)) { - goto done; - } - - /* - * fetch a list of the old subkeys so we can determine if anything has - * changed - */ - - werr = regsubkey_ctr_init(ctx, &old_subkeys); - if (!W_ERROR_IS_OK(werr)) { - DEBUG(0,("regdb_store_keys: talloc() failure!\n")); - goto done; - } - - regdb_fetch_keys_internal(db, key, old_subkeys); - - num_subkeys = regsubkey_ctr_numkeys(ctr); - old_num_subkeys = regsubkey_ctr_numkeys(old_subkeys); - if ((num_subkeys && old_num_subkeys) && - (num_subkeys == old_num_subkeys)) { - - for (i = 0; i < num_subkeys; i++) { - if (strcmp(regsubkey_ctr_specific_key(ctr, i), - regsubkey_ctr_specific_key(old_subkeys, i)) - != 0) - { - break; - } - } - if (i == num_subkeys) { - /* - * Nothing changed, no point to even start a tdb - * transaction - */ - - ret = true; - goto done; - } - } - - TALLOC_FREE(old_subkeys); + TALLOC_CTX *mem_ctx = talloc_stackframe(); - if (db->transaction_start(db) != 0) { - DEBUG(0, ("regdb_store_keys: transaction_start failed\n")); - goto done; - } + store_ctx = (struct regdb_store_keys_context *)private_data; /* * Re-fetch the old keys inside the transaction */ - werr = regsubkey_ctr_init(ctx, &old_subkeys); - if (!W_ERROR_IS_OK(werr)) { - DEBUG(0,("regdb_store_keys: talloc() failure!\n")); - goto cancel; - } + werr = regsubkey_ctr_init(mem_ctx, &old_subkeys); + W_ERROR_NOT_OK_GOTO_DONE(werr); - regdb_fetch_keys_internal(db, key, old_subkeys); + regdb_fetch_keys_internal(db, store_ctx->key, old_subkeys); /* * Make the store operation as safe as possible without transactions: @@ -823,21 +779,22 @@ static bool regdb_store_keys_internal(struct db_context *db, const char *key, for (i=0; ictr, oldkeyname)) { /* * It's still around, don't delete */ - continue; } - path = talloc_asprintf(ctx, "%s/%s", key, oldkeyname); + path = talloc_asprintf(mem_ctx, "%s/%s", store_ctx->key, + oldkeyname); if (!path) { - goto cancel; + werr = WERR_NOMEM; + goto done; } werr = regdb_delete_key_lists(db, path); - W_ERROR_NOT_OK_GOTO(werr, cancel); + W_ERROR_NOT_OK_GOTO_DONE(werr); TALLOC_FREE(path); } @@ -846,47 +803,41 @@ static bool regdb_store_keys_internal(struct db_context *db, const char *key, /* (2) store the subkey list for the parent */ - werr = regdb_store_keys_internal2(db, key, ctr); + werr = regdb_store_keys_internal2(db, store_ctx->key, store_ctx->ctr); if (!W_ERROR_IS_OK(werr)) { DEBUG(0,("regdb_store_keys: Failed to store new subkey list " - "for parent [%s]: %s\n", key, win_errstr(werr))); - goto cancel; + "for parent [%s]: %s\n", store_ctx->key, + win_errstr(werr))); + goto done; } /* (3) now create records for any subkeys that don't already exist */ - num_subkeys = regsubkey_ctr_numkeys(ctr); + num_subkeys = regsubkey_ctr_numkeys(store_ctx->ctr); if (num_subkeys == 0) { - werr = regsubkey_ctr_init(ctx, &subkeys); - if (!W_ERROR_IS_OK(werr)) { - DEBUG(0,("regdb_store_keys: talloc() failure!\n")); - goto cancel; - } + werr = regsubkey_ctr_init(mem_ctx, &subkeys); + W_ERROR_NOT_OK_GOTO_DONE(werr); - werr = regdb_store_keys_internal2(db, key, subkeys); + werr = regdb_store_keys_internal2(db, store_ctx->key, subkeys); if (!W_ERROR_IS_OK(werr)) { DEBUG(0,("regdb_store_keys: Failed to store " - "new record for key [%s]: %s\n", key, - win_errstr(werr))); - goto cancel; + "new record for key [%s]: %s\n", + store_ctx->key, win_errstr(werr))); + goto done; } TALLOC_FREE(subkeys); - } for (i=0; ikey, + regsubkey_ctr_specific_key(store_ctx->ctr, i)); if (!path) { - goto cancel; - } - werr = regsubkey_ctr_init(ctx, &subkeys); - if (!W_ERROR_IS_OK(werr)) { - DEBUG(0,("regdb_store_keys: talloc() failure!\n")); - goto cancel; + werr = WERR_NOMEM; + goto done; } + werr = regsubkey_ctr_init(mem_ctx, &subkeys); + W_ERROR_NOT_OK_GOTO_DONE(werr); if (regdb_fetch_keys_internal(db, path, subkeys) == -1) { /* create a record with 0 subkeys */ @@ -895,7 +846,7 @@ static bool regdb_store_keys_internal(struct db_context *db, const char *key, DEBUG(0,("regdb_store_keys: Failed to store " "new record for key [%s]: %s\n", path, win_errstr(werr))); - goto cancel; + goto done; } } @@ -903,20 +854,75 @@ static bool regdb_store_keys_internal(struct db_context *db, const char *key, TALLOC_FREE(path); } - if (db->transaction_commit(db) != 0) { - DEBUG(0, ("regdb_store_keys: Could not commit transaction\n")); + werr = WERR_OK; + +done: + talloc_free(mem_ctx); + return werror_to_ntstatus(werr); +} + +static bool regdb_store_keys_internal(struct db_context *db, const char *key, + struct regsubkey_ctr *ctr) +{ + int num_subkeys, old_num_subkeys, i; + struct regsubkey_ctr *old_subkeys = NULL; + TALLOC_CTX *ctx = talloc_stackframe(); + WERROR werr; + bool ret = false; + struct regdb_store_keys_context store_ctx; + + if (!regdb_key_is_base_key(key) && !regdb_key_exists(db, key)) { goto done; } - ret = true; - goto done; + /* + * fetch a list of the old subkeys so we can determine if anything has + * changed + */ -cancel: - ret = false; - if (db->transaction_cancel(db) != 0) { - smb_panic("regdb_store_keys: transaction_cancel failed\n"); + werr = regsubkey_ctr_init(ctx, &old_subkeys); + if (!W_ERROR_IS_OK(werr)) { + DEBUG(0,("regdb_store_keys: talloc() failure!\n")); + goto done; } + regdb_fetch_keys_internal(db, key, old_subkeys); + + num_subkeys = regsubkey_ctr_numkeys(ctr); + old_num_subkeys = regsubkey_ctr_numkeys(old_subkeys); + if ((num_subkeys && old_num_subkeys) && + (num_subkeys == old_num_subkeys)) { + + for (i = 0; i < num_subkeys; i++) { + if (strcmp(regsubkey_ctr_specific_key(ctr, i), + regsubkey_ctr_specific_key(old_subkeys, i)) + != 0) + { + break; + } + } + if (i == num_subkeys) { + /* + * Nothing changed, no point to even start a tdb + * transaction + */ + + ret = true; + goto done; + } + } + + TALLOC_FREE(old_subkeys); + + store_ctx.key = key; + store_ctx.ctr = ctr; + + werr = ntstatus_to_werror(dbwrap_trans_do(db, + regdb_store_keys_action, + &store_ctx)); + + ret = W_ERROR_IS_OK(werr); + done: TALLOC_FREE(ctx); -- cgit From 8c7b9604931a787107bc01b359a231d376ed92c0 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Thu, 9 Jul 2009 10:41:59 +0200 Subject: s3:registry: use transaction wrapper in regdb_create_subkey() Michael --- source3/registry/reg_backend_db.c | 73 ++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 31 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 5c714a40b4..08d72c3215 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -934,66 +934,77 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr) return regdb_store_keys_internal(regdb, key, ctr); } -static WERROR regdb_create_subkey(const char *key, const char *subkey) +struct regdb_create_subkey_context { + const char *key; + const char *subkey; +}; + +static NTSTATUS regdb_create_subkey_action(struct db_context *db, + void *private_data) { WERROR werr; + struct regdb_create_subkey_context *create_ctx; struct regsubkey_ctr *subkeys; TALLOC_CTX *mem_ctx = talloc_stackframe(); - if (!regdb_key_is_base_key(key) && !regdb_key_exists(regdb, key)) { - werr = WERR_NOT_FOUND; - goto done; - } + create_ctx = (struct regdb_create_subkey_context *)private_data; werr = regsubkey_ctr_init(mem_ctx, &subkeys); W_ERROR_NOT_OK_GOTO_DONE(werr); - if (regdb_fetch_keys_internal(regdb, key, subkeys) < 0) { + if (regdb_fetch_keys_internal(db, create_ctx->key, subkeys) < 0) { werr = WERR_REG_IO_FAILURE; goto done; } - if (regsubkey_ctr_key_exists(subkeys, subkey)) { - werr = WERR_OK; - goto done; + werr = regsubkey_ctr_addkey(subkeys, create_ctx->subkey); + W_ERROR_NOT_OK_GOTO_DONE(werr); + + werr = regdb_store_keys_internal2(db, create_ctx->key, subkeys); + if (!W_ERROR_IS_OK(werr)) { + DEBUG(0, (__location__ " failed to store new subkey list for " + "parent key %s: %s\n", create_ctx->key, + win_errstr(werr))); } - talloc_free(subkeys); +done: + talloc_free(mem_ctx); + return werror_to_ntstatus(werr); +} - if (regdb->transaction_start(regdb) != 0) { - werr = WERR_REG_IO_FAILURE; +static WERROR regdb_create_subkey(const char *key, const char *subkey) +{ + WERROR werr; + struct regsubkey_ctr *subkeys; + TALLOC_CTX *mem_ctx = talloc_stackframe(); + struct regdb_create_subkey_context create_ctx; + + if (!regdb_key_is_base_key(key) && !regdb_key_exists(regdb, key)) { + werr = WERR_NOT_FOUND; goto done; } werr = regsubkey_ctr_init(mem_ctx, &subkeys); - W_ERROR_NOT_OK_GOTO(werr, cancel); + W_ERROR_NOT_OK_GOTO_DONE(werr); if (regdb_fetch_keys_internal(regdb, key, subkeys) < 0) { werr = WERR_REG_IO_FAILURE; - goto cancel; + goto done; } - werr = regsubkey_ctr_addkey(subkeys, subkey); - W_ERROR_NOT_OK_GOTO(werr, cancel); - - werr = regdb_store_keys_internal2(regdb, key, subkeys); - if (!W_ERROR_IS_OK(werr)) { - DEBUG(0, (__location__ " failed to store new subkey list for " - "parent key %s: %s\n", key, win_errstr(werr))); - goto cancel; + if (regsubkey_ctr_key_exists(subkeys, subkey)) { + werr = WERR_OK; + goto done; } - if (regdb->transaction_commit(regdb) != 0) { - werr = WERR_REG_IO_FAILURE; - DEBUG(0, (__location__ " failed to commit transaction\n")); - } + talloc_free(subkeys); - goto done; + create_ctx.key = key; + create_ctx.subkey = subkey; -cancel: - if (regdb->transaction_cancel(regdb) != 0) { - smb_panic("regdb_create_subkey: transaction_cancel failed\n"); - } + werr = ntstatus_to_werror(dbwrap_trans_do(regdb, + regdb_create_subkey_action, + &create_ctx)); done: talloc_free(mem_ctx); -- cgit From 5640598cbb66fb0e65413e53a11ff82a553caad6 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Thu, 9 Jul 2009 10:52:40 +0200 Subject: s3:registry: add a comment header for the create_subkey set of functions Michael --- source3/registry/reg_backend_db.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 08d72c3215..f60ee1f7a6 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -934,6 +934,10 @@ bool regdb_store_keys(const char *key, struct regsubkey_ctr *ctr) return regdb_store_keys_internal(regdb, key, ctr); } +/** + * create a subkey of a given key + */ + struct regdb_create_subkey_context { const char *key; const char *subkey; -- cgit From a48d8353c79685371dbd2cc73b6c9032c5166a5b Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Thu, 9 Jul 2009 10:54:18 +0200 Subject: s3:registry: add a comment header for the delete_subkey set of commands. Michael --- source3/registry/reg_backend_db.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index f60ee1f7a6..8cd79b15b2 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -1015,6 +1015,10 @@ done: return werr; } +/** + * create a subkey of a given key + */ + static WERROR regdb_delete_subkey(const char *key, const char *subkey) { WERROR werr; -- cgit From 2d6dbcd0b13da469f8b7dc6ed65e51d91ce1ab9c Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Thu, 9 Jul 2009 11:04:20 +0200 Subject: s3:registry: use transaction wrapper in regdb_delete_subkey(). Michael --- source3/registry/reg_backend_db.c | 86 ++++++++++++++++++++++----------------- 1 file changed, 49 insertions(+), 37 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 8cd79b15b2..095b0c5b22 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -1019,11 +1019,53 @@ done: * create a subkey of a given key */ -static WERROR regdb_delete_subkey(const char *key, const char *subkey) +struct regdb_delete_subkey_context { + const char *key; + const char *subkey; + const char *path; +}; + +static NTSTATUS regdb_delete_subkey_action(struct db_context *db, + void *private_data) { WERROR werr; + struct regdb_delete_subkey_context *delete_ctx; struct regsubkey_ctr *subkeys; + TALLOC_CTX *mem_ctx = talloc_stackframe(); + + delete_ctx = (struct regdb_delete_subkey_context *)private_data; + + werr = regdb_delete_key_lists(db, delete_ctx->path); + W_ERROR_NOT_OK_GOTO_DONE(werr); + + werr = regsubkey_ctr_init(mem_ctx, &subkeys); + W_ERROR_NOT_OK_GOTO_DONE(werr); + + if (regdb_fetch_keys_internal(db, delete_ctx->key, subkeys) < 0) { + werr = WERR_REG_IO_FAILURE; + goto done; + } + + werr = regsubkey_ctr_delkey(subkeys, delete_ctx->subkey); + W_ERROR_NOT_OK_GOTO_DONE(werr); + + werr = regdb_store_keys_internal2(db, delete_ctx->key, subkeys); + if (!W_ERROR_IS_OK(werr)) { + DEBUG(0, (__location__ " failed to store new subkey_list for " + "parent key %s: %s\n", delete_ctx->key, + win_errstr(werr))); + } + +done: + talloc_free(mem_ctx); + return werror_to_ntstatus(werr); +} + +static WERROR regdb_delete_subkey(const char *key, const char *subkey) +{ + WERROR werr; char *path; + struct regdb_delete_subkey_context delete_ctx; TALLOC_CTX *mem_ctx = talloc_stackframe(); if (!regdb_key_is_base_key(key) && !regdb_key_exists(regdb, key)) { @@ -1042,43 +1084,13 @@ static WERROR regdb_delete_subkey(const char *key, const char *subkey) goto done; } - if (regdb->transaction_start(regdb) != 0) { - werr = WERR_REG_IO_FAILURE; - goto done; - } - - werr = regdb_delete_key_lists(regdb, path); - W_ERROR_NOT_OK_GOTO(werr, cancel); - - werr = regsubkey_ctr_init(mem_ctx, &subkeys); - W_ERROR_NOT_OK_GOTO(werr, cancel); - - if (regdb_fetch_keys_internal(regdb, key, subkeys) < 0) { - werr = WERR_REG_IO_FAILURE; - goto cancel; - } - - werr = regsubkey_ctr_delkey(subkeys, subkey); - W_ERROR_NOT_OK_GOTO(werr, cancel); - - werr = regdb_store_keys_internal2(regdb, key, subkeys); - if (!W_ERROR_IS_OK(werr)) { - DEBUG(0, (__location__ " failed to store new subkey_list for " - "parent key %s: %s\n", key, win_errstr(werr))); - goto cancel; - } - - if (regdb->transaction_commit(regdb) != 0) { - DEBUG(0, (__location__ " failed to commit transaction\n")); - werr = WERR_REG_IO_FAILURE; - } + delete_ctx.key = key; + delete_ctx.subkey = subkey; + delete_ctx.path = path; - goto done; - -cancel: - if (regdb->transaction_cancel(regdb) != 0) { - smb_panic("regdb_delete_subkey: transaction_cancel failed\n"); - } + werr = ntstatus_to_werror(dbwrap_trans_do(regdb, + regdb_delete_subkey_action, + &delete_ctx)); done: talloc_free(mem_ctx); -- cgit From 109ea29b2c1a3bc752f9afda2c0010b9e675aa83 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Thu, 9 Jul 2009 12:54:16 +0200 Subject: s3:registry: restructure logic of create_sorted_subkes() slightly This makes it clearer to me, and it also makes it easier to use the transaction retry wrapper in the next step. Michael --- source3/registry/reg_backend_db.c | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 095b0c5b22..e0e234f7c6 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -1195,18 +1195,18 @@ static bool create_sorted_subkeys(const char *key, const char *sorted_keyname) werr = regsubkey_ctr_init(talloc_tos(), &ctr); if (!W_ERROR_IS_OK(werr)) { - goto fail; + goto commit; } res = regdb_fetch_keys_internal(regdb, key, ctr); if (res == -1) { - goto fail; + goto commit; } num_subkeys = regsubkey_ctr_numkeys(ctr); sorted_subkeys = talloc_array(ctr, char *, num_subkeys); if (sorted_subkeys == NULL) { - goto fail; + goto commit; } len = 4 + 4*num_subkeys; @@ -1215,7 +1215,7 @@ static bool create_sorted_subkeys(const char *key, const char *sorted_keyname) sorted_subkeys[i] = talloc_strdup_upper(sorted_subkeys, regsubkey_ctr_specific_key(ctr, i)); if (sorted_subkeys[i] == NULL) { - goto fail; + goto commit; } len += strlen(sorted_subkeys[i])+1; } @@ -1224,7 +1224,7 @@ static bool create_sorted_subkeys(const char *key, const char *sorted_keyname) buf = talloc_array(ctr, char, len); if (buf == NULL) { - goto fail; + goto commit; } p = buf + 4 + 4*num_subkeys; @@ -1242,21 +1242,17 @@ static bool create_sorted_subkeys(const char *key, const char *sorted_keyname) TDB_REPLACE); if (!NT_STATUS_IS_OK(status)) { /* - * Don't use a "goto fail;" here, this would commit the broken + * Don't use a "goto commit;" here, this would commit the broken * transaction. See below for an explanation. */ - if (regdb->transaction_cancel(regdb) == -1) { - smb_panic("create_sorted_subkeys: transaction_cancel " - "failed\n"); - } - TALLOC_FREE(ctr); - return false; + goto cancel; } result = true; - fail: + +commit: /* - * We only get here via the "goto fail" when we did not write anything + * We only get here via the "goto commit" when we did not write anything * yet. Using transaction_commit even in a failure case is necessary * because this (disposable) call might be nested in other * transactions. Doing a cancel here would destroy the possibility of @@ -1267,7 +1263,16 @@ static bool create_sorted_subkeys(const char *key, const char *sorted_keyname) "failed\n")); result = false; } + goto done; + +cancel: + if (regdb->transaction_cancel(regdb) == -1) { + smb_panic("create_sorted_subkeys: transaction_cancel " + "failed\n"); + } + result = false; +done: TALLOC_FREE(ctr); return result; } -- cgit From c52dd1d5b81ce71855a3215f1b23704ac450fdee Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Mon, 13 Jul 2009 17:15:14 +0200 Subject: s3:registry: use transaction wrapper in create_sorted_subkeys() Michael --- source3/registry/reg_backend_db.c | 99 ++++++++++++++++++++------------------- 1 file changed, 51 insertions(+), 48 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index e0e234f7c6..11e6f66760 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -1174,39 +1174,55 @@ static int cmp_keynames(const void *p1, const void *p2) return StrCaseCmp(*((char **)p1), *((char **)p2)); } -static bool create_sorted_subkeys(const char *key, const char *sorted_keyname) +struct create_sorted_subkeys_context { + const char *key; + const char *sorted_keyname; +}; + +static NTSTATUS create_sorted_subkeys_action(struct db_context *db, + void *private_data) { char **sorted_subkeys; struct regsubkey_ctr *ctr; - bool result = false; NTSTATUS status; char *buf; char *p; int i, res; size_t len; int num_subkeys; - WERROR werr; + struct create_sorted_subkeys_context *sorted_ctx; - if (regdb->transaction_start(regdb) != 0) { - DEBUG(0, ("create_sorted_subkeys: transaction_start " - "failed\n")); - return false; - } + sorted_ctx = (struct create_sorted_subkeys_context *)private_data; - werr = regsubkey_ctr_init(talloc_tos(), &ctr); - if (!W_ERROR_IS_OK(werr)) { - goto commit; + /* + * In this function, we only treat failing of the actual write to + * the db as a real error. All preliminary errors, at a stage when + * nothing has been written to the DB yet are treated as success + * to be committed (as an empty transaction). + * + * The reason is that this (disposable) call might be nested in other + * transactions. Doing a cancel here would destroy the possibility of + * a transaction_commit for transactions that we might be wrapped in. + */ + + status = werror_to_ntstatus(regsubkey_ctr_init(talloc_tos(), &ctr)); + if (!NT_STATUS_IS_OK(status)) { + /* don't treat this as an error */ + status = NT_STATUS_OK; + goto done; } - res = regdb_fetch_keys_internal(regdb, key, ctr); + res = regdb_fetch_keys_internal(db, sorted_ctx->key, ctr); if (res == -1) { - goto commit; + /* don't treat this as an error */ + goto done; } num_subkeys = regsubkey_ctr_numkeys(ctr); sorted_subkeys = talloc_array(ctr, char *, num_subkeys); if (sorted_subkeys == NULL) { - goto commit; + /* don't treat this as an error */ + goto done; } len = 4 + 4*num_subkeys; @@ -1215,7 +1231,8 @@ static bool create_sorted_subkeys(const char *key, const char *sorted_keyname) sorted_subkeys[i] = talloc_strdup_upper(sorted_subkeys, regsubkey_ctr_specific_key(ctr, i)); if (sorted_subkeys[i] == NULL) { - goto commit; + /* don't treat this as an error */ + goto done; } len += strlen(sorted_subkeys[i])+1; } @@ -1224,7 +1241,8 @@ static bool create_sorted_subkeys(const char *key, const char *sorted_keyname) buf = talloc_array(ctr, char, len); if (buf == NULL) { - goto commit; + /* don't treat this as an error */ + goto done; } p = buf + 4 + 4*num_subkeys; @@ -1238,43 +1256,28 @@ static bool create_sorted_subkeys(const char *key, const char *sorted_keyname) } status = dbwrap_store_bystring( - regdb, sorted_keyname, make_tdb_data((uint8_t *)buf, len), + db, sorted_ctx->sorted_keyname, make_tdb_data((uint8_t *)buf, + len), TDB_REPLACE); - if (!NT_STATUS_IS_OK(status)) { - /* - * Don't use a "goto commit;" here, this would commit the broken - * transaction. See below for an explanation. - */ - goto cancel; - } - result = true; +done: + talloc_free(ctr); + return status; +} -commit: - /* - * We only get here via the "goto commit" when we did not write anything - * yet. Using transaction_commit even in a failure case is necessary - * because this (disposable) call might be nested in other - * transactions. Doing a cancel here would destroy the possibility of - * a transaction_commit for transactions that we might be wrapped in. - */ - if (regdb->transaction_commit(regdb) == -1) { - DEBUG(0, ("create_sorted_subkeys: transaction_commit " - "failed\n")); - result = false; - } - goto done; +static bool create_sorted_subkeys(const char *key, const char *sorted_keyname) +{ + NTSTATUS status; + struct create_sorted_subkeys_context sorted_ctx; -cancel: - if (regdb->transaction_cancel(regdb) == -1) { - smb_panic("create_sorted_subkeys: transaction_cancel " - "failed\n"); - } - result = false; + sorted_ctx.key = key; + sorted_ctx.sorted_keyname = sorted_keyname; -done: - TALLOC_FREE(ctr); - return result; + status = dbwrap_trans_do(regdb, + create_sorted_subkeys_action, + &sorted_ctx); + + return NT_STATUS_IS_OK(status); } struct scan_subkey_state { -- cgit From dc0bcfa188cb24c5a34f592ece946682d5fb8afe Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Wed, 15 Jul 2009 12:45:43 +0200 Subject: s3:registry: turn regdb_fetch_keys_internal() from int to WERROR return type This way, more error information is propagated to the callers. Michael --- source3/registry/reg_backend_db.c | 85 ++++++++++++++++++++++++--------------- 1 file changed, 53 insertions(+), 32 deletions(-) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 11e6f66760..7825edd5c2 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -29,8 +29,8 @@ static int regdb_refcount; static bool regdb_key_exists(struct db_context *db, const char *key); static bool regdb_key_is_base_key(const char *key); -static int regdb_fetch_keys_internal(struct db_context *db, const char *key, - struct regsubkey_ctr *ctr); +static WERROR regdb_fetch_keys_internal(struct db_context *db, const char *key, + struct regsubkey_ctr *ctr); static bool regdb_store_keys_internal(struct db_context *db, const char *key, struct regsubkey_ctr *ctr); static int regdb_fetch_values_internal(struct db_context *db, const char* key, @@ -182,7 +182,13 @@ static WERROR init_registry_key_internal(struct db_context *db, goto fail; } - regdb_fetch_keys_internal(db, base, subkeys); + werr = regdb_fetch_keys_internal(db, base, subkeys); + if (!W_ERROR_IS_OK(werr) && + !W_ERROR_EQUAL(werr, WERR_NOT_FOUND)) + { + goto fail; + } + if (*subkeyname) { werr = regsubkey_ctr_addkey(subkeys, subkeyname); if (!W_ERROR_IS_OK(werr)) { @@ -750,7 +756,12 @@ static NTSTATUS regdb_store_keys_action(struct db_context *db, werr = regsubkey_ctr_init(mem_ctx, &old_subkeys); W_ERROR_NOT_OK_GOTO_DONE(werr); - regdb_fetch_keys_internal(db, store_ctx->key, old_subkeys); + werr = regdb_fetch_keys_internal(db, store_ctx->key, old_subkeys); + if (!W_ERROR_IS_OK(werr) && + !W_ERROR_EQUAL(werr, WERR_NOT_FOUND)) + { + goto done; + } /* * Make the store operation as safe as possible without transactions: @@ -839,7 +850,8 @@ static NTSTATUS regdb_store_keys_action(struct db_context *db, werr = regsubkey_ctr_init(mem_ctx, &subkeys); W_ERROR_NOT_OK_GOTO_DONE(werr); - if (regdb_fetch_keys_internal(db, path, subkeys) == -1) { + werr = regdb_fetch_keys_internal(db, path, subkeys); + if (!W_ERROR_IS_OK(werr)) { /* create a record with 0 subkeys */ werr = regdb_store_keys_internal2(db, path, subkeys); if (!W_ERROR_IS_OK(werr)) { @@ -886,7 +898,12 @@ static bool regdb_store_keys_internal(struct db_context *db, const char *key, goto done; } - regdb_fetch_keys_internal(db, key, old_subkeys); + werr = regdb_fetch_keys_internal(db, key, old_subkeys); + if (!W_ERROR_IS_OK(werr) && + !W_ERROR_EQUAL(werr, WERR_NOT_FOUND)) + { + goto done; + } num_subkeys = regsubkey_ctr_numkeys(ctr); old_num_subkeys = regsubkey_ctr_numkeys(old_subkeys); @@ -956,10 +973,8 @@ static NTSTATUS regdb_create_subkey_action(struct db_context *db, werr = regsubkey_ctr_init(mem_ctx, &subkeys); W_ERROR_NOT_OK_GOTO_DONE(werr); - if (regdb_fetch_keys_internal(db, create_ctx->key, subkeys) < 0) { - werr = WERR_REG_IO_FAILURE; - goto done; - } + werr = regdb_fetch_keys_internal(db, create_ctx->key, subkeys); + W_ERROR_NOT_OK_GOTO_DONE(werr); werr = regsubkey_ctr_addkey(subkeys, create_ctx->subkey); W_ERROR_NOT_OK_GOTO_DONE(werr); @@ -991,10 +1006,8 @@ static WERROR regdb_create_subkey(const char *key, const char *subkey) werr = regsubkey_ctr_init(mem_ctx, &subkeys); W_ERROR_NOT_OK_GOTO_DONE(werr); - if (regdb_fetch_keys_internal(regdb, key, subkeys) < 0) { - werr = WERR_REG_IO_FAILURE; - goto done; - } + werr = regdb_fetch_keys_internal(regdb, key, subkeys); + W_ERROR_NOT_OK_GOTO_DONE(werr); if (regsubkey_ctr_key_exists(subkeys, subkey)) { werr = WERR_OK; @@ -1041,10 +1054,8 @@ static NTSTATUS regdb_delete_subkey_action(struct db_context *db, werr = regsubkey_ctr_init(mem_ctx, &subkeys); W_ERROR_NOT_OK_GOTO_DONE(werr); - if (regdb_fetch_keys_internal(db, delete_ctx->key, subkeys) < 0) { - werr = WERR_REG_IO_FAILURE; - goto done; - } + werr = regdb_fetch_keys_internal(db, delete_ctx->key, subkeys); + W_ERROR_NOT_OK_GOTO_DONE(werr); werr = regsubkey_ctr_delkey(subkeys, delete_ctx->subkey); W_ERROR_NOT_OK_GOTO_DONE(werr); @@ -1187,7 +1198,7 @@ static NTSTATUS create_sorted_subkeys_action(struct db_context *db, NTSTATUS status; char *buf; char *p; - int i, res; + int i; size_t len; int num_subkeys; struct create_sorted_subkeys_context *sorted_ctx; @@ -1212,9 +1223,12 @@ static NTSTATUS create_sorted_subkeys_action(struct db_context *db, goto done; } - res = regdb_fetch_keys_internal(db, sorted_ctx->key, ctr); - if (res == -1) { + status = werror_to_ntstatus(regdb_fetch_keys_internal(db, + sorted_ctx->key, + ctr)); + if (!NT_STATUS_IS_OK(status)) { /* don't treat this as an error */ + status = NT_STATUS_OK; goto done; } @@ -1423,36 +1437,36 @@ done: released by the caller. ***********************************************************************/ -static int regdb_fetch_keys_internal(struct db_context *db, const char *key, - struct regsubkey_ctr *ctr) +static WERROR regdb_fetch_keys_internal(struct db_context *db, const char *key, + struct regsubkey_ctr *ctr) { WERROR werr; - uint32 num_items; + uint32_t num_items; uint8 *buf; uint32 buflen, len; int i; fstring subkeyname; - int ret = -1; TALLOC_CTX *frame = talloc_stackframe(); TDB_DATA value; DEBUG(11,("regdb_fetch_keys: Enter key => [%s]\n", key ? key : "NULL")); + frame = talloc_stackframe(); + if (!regdb_key_exists(db, key)) { + DEBUG(10, ("key [%s] not found\n", key)); + werr = WERR_NOT_FOUND; goto done; } werr = regsubkey_ctr_set_seqnum(ctr, db->get_seqnum(db)); - if (!W_ERROR_IS_OK(werr)) { - goto done; - } + W_ERROR_NOT_OK_GOTO_DONE(werr); value = regdb_fetch_key_internal(db, frame, key); if (value.dptr == NULL) { DEBUG(10, ("regdb_fetch_keys: no subkeys found for key [%s]\n", key)); - ret = 0; goto done; } @@ -1466,21 +1480,28 @@ static int regdb_fetch_keys_internal(struct db_context *db, const char *key, if (!W_ERROR_IS_OK(werr)) { DEBUG(5, ("regdb_fetch_keys: regsubkey_ctr_addkey " "failed: %s\n", win_errstr(werr))); + num_items = 0; goto done; } } DEBUG(11,("regdb_fetch_keys: Exit [%d] items\n", num_items)); - ret = num_items; done: TALLOC_FREE(frame); - return ret; + return werr; } int regdb_fetch_keys(const char *key, struct regsubkey_ctr *ctr) { - return regdb_fetch_keys_internal(regdb, key, ctr); + WERROR werr; + + werr = regdb_fetch_keys_internal(regdb, key, ctr); + if (!W_ERROR_IS_OK(werr)) { + return -1; + } + + return regsubkey_ctr_numkeys(ctr); } /**************************************************************************** -- cgit From 78576117eb4292e4e2750928d5f84c2edc94192f Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Wed, 15 Jul 2009 12:50:55 +0200 Subject: s3:registry: flush the provided subkey_ctr in regdb_fetch_keys_internal() This way, we always return what has really been read from the db, and not more. The callers assume exactly this, but one could hand in an already pre-filled subkey container... Michael --- source3/registry/reg_backend_db.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 7825edd5c2..9fd5c3161b 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -1474,6 +1474,9 @@ static WERROR regdb_fetch_keys_internal(struct db_context *db, const char *key, buflen = value.dsize; len = tdb_unpack( buf, buflen, "d", &num_items); + werr = regsubkey_ctr_reinit(ctr); + W_ERROR_NOT_OK_GOTO_DONE(werr); + for (i=0; i Date: Tue, 7 Jul 2009 17:16:21 +0200 Subject: s3:registry: db backend: add my C Michael --- source3/registry/reg_backend_db.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source3/registry/reg_backend_db.c') diff --git a/source3/registry/reg_backend_db.c b/source3/registry/reg_backend_db.c index 9fd5c3161b..dec43ae741 100644 --- a/source3/registry/reg_backend_db.c +++ b/source3/registry/reg_backend_db.c @@ -2,6 +2,7 @@ * Unix SMB/CIFS implementation. * Virtual Windows Registry Layer * Copyright (C) Gerald Carter 2002-2005 + * Copyright (C) Michael Adam 2007-2009 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by -- cgit