config: use a snapshot for the iterator
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
diff --git a/src/config_file.c b/src/config_file.c
index 24ace60..81828ef 100644
--- a/src/config_file.c
+++ b/src/config_file.c
@@ -113,6 +113,7 @@ static int config_write(diskfile_backend *cfg, const char *key, const regex_t *p
static char *escape_value(const char *ptr);
int git_config_file__snapshot(git_config_backend **out, diskfile_backend *in);
+static int config_snapshot(git_config_backend **out, git_config_backend *in);
static void set_parse_error(struct reader *reader, int col, const char *error_str)
{
@@ -326,6 +327,7 @@ static void backend_free(git_config_backend *_backend)
static void config_iterator_free(
git_config_iterator* iter)
{
+ iter->backend->free(iter->backend);
git__free(iter);
}
@@ -360,15 +362,27 @@ static int config_iterator_new(
git_config_iterator **iter,
struct git_config_backend* backend)
{
- diskfile_header *h = (diskfile_header *)backend;
- git_config_file_iter *it = git__calloc(1, sizeof(git_config_file_iter));
+ diskfile_header *h;
+ git_config_file_iter *it;
+ git_config_backend *snapshot;
+ diskfile_backend *b = (diskfile_backend *) backend;
+ int error;
+
+ if ((error = config_snapshot(&snapshot, backend)) < 0)
+ return error;
+ if ((error = snapshot->open(snapshot, b->level)) < 0)
+ return error;
+
+ it = git__calloc(1, sizeof(git_config_file_iter));
GITERR_CHECK_ALLOC(it);
+ h = (diskfile_header *)snapshot;
+
/* strmap_begin() is currently a macro returning 0 */
GIT_UNUSED(h);
- it->parent.backend = backend;
+ it->parent.backend = snapshot;
it->iter = git_strmap_begin(h->values);
it->next_var = NULL;