From aba2b04b6c5584db63d03adab57fe1fd12ee71b4 Mon Sep 17 00:00:00 2001 From: Chris Davis Date: Wed, 25 Jun 2014 22:29:06 -0700 Subject: regedit: don't fail loading keys if just a few are unavailable Sometimes a key might fail to open due to access restrictions. Only report failure if all keys failed to be opened. Signed-off-by: Chris Davis Reviewed-by: Andreas Schneider Reviewed-by: Michael Adam --- source3/utils/regedit_treeview.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/source3/utils/regedit_treeview.c b/source3/utils/regedit_treeview.c index 9962ad99fb..c8a65965bc 100644 --- a/source3/utils/regedit_treeview.c +++ b/source3/utils/regedit_treeview.c @@ -179,7 +179,7 @@ WERROR tree_node_load_children(struct tree_node *node) struct registry_key *key; const char *key_name, *klass; NTTIME modified; - uint32_t i, nsubkeys; + uint32_t i, nsubkeys, count; WERROR rv; struct tree_node *prev, **array; @@ -196,7 +196,7 @@ WERROR tree_node_load_children(struct tree_node *node) return WERR_NOMEM; } - for (i = 0; i < nsubkeys; ++i) { + for (count = 0, i = 0; i < nsubkeys; ++i) { rv = reg_key_get_subkey_by_index(node, node->key, i, &key_name, &klass, &modified); @@ -206,25 +206,28 @@ WERROR tree_node_load_children(struct tree_node *node) rv = reg_open_key(node, node->key, key_name, &key); if (!W_ERROR_IS_OK(rv)) { - goto finish; + continue; } - array[i] = tree_node_new(node, node, key_name, key); - if (array[i] == NULL) { + array[count] = tree_node_new(node, node, key_name, key); + if (array[count] == NULL) { rv = WERR_NOMEM; goto finish; } + ++count; } - TYPESAFE_QSORT(array, nsubkeys, node_cmp); + if (count) { + TYPESAFE_QSORT(array, count, node_cmp); - for (i = 1, prev = array[0]; i < nsubkeys; ++i) { - tree_node_append(prev, array[i]); - prev = array[i]; - } - node->child_head = array[0]; + for (i = 1, prev = array[0]; i < count; ++i) { + tree_node_append(prev, array[i]); + prev = array[i]; + } + node->child_head = array[0]; - rv = WERR_OK; + rv = WERR_OK; + } finish: if (!W_ERROR_IS_OK(rv)) { -- cgit