Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/libgit2.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Martín Nieto <cmn@dwim.me>2013-09-07 21:07:39 +0400
committerCarlos Martín Nieto <cmn@dwim.me>2013-09-07 22:51:26 +0400
commit53ea0513716a8d1e1bc1347cca5a333e26ca9f1e (patch)
tree0b2f16f134d956d27d7b9004ec9949fbdcdbe3f0 /src/config_file.c
parent69789922984d2e22f267da5f35cd64cd17c36dc0 (diff)
config: handle realloc issues from larger depths
As the include depth increases, the chance of a realloc increases. This means that whenever we run git_array_alloc() or call config_parse(), we need to remember what our reader's index is so we can look it up again.
Diffstat (limited to 'src/config_file.c')
-rw-r--r--src/config_file.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/config_file.c b/src/config_file.c
index 034d1d7b1..bd4fa7471 100644
--- a/src/config_file.c
+++ b/src/config_file.c
@@ -191,6 +191,7 @@ static int config_open(git_config_backend *cfg, git_config_level_t level)
b->values = NULL;
}
+ reader = git_array_get(b->readers, 0);
git_buf_free(&reader->buffer);
return res;
}
@@ -948,12 +949,14 @@ static int config_parse(diskfile_backend *cfg_file, struct reader *reader, git_c
git_buf buf = GIT_BUF_INIT;
int result = 0;
khiter_t pos;
+ uint32_t reader_idx;
if (depth >= MAX_INCLUDE_DEPTH) {
giterr_set(GITERR_CONFIG, "Maximum config include depth reached");
return -1;
}
+ reader_idx = git_array_size(cfg_file->readers) - 1;
/* Initialize the reading position */
reader->read_ptr = reader->buffer.ptr;
reader->eof = 0;
@@ -1027,12 +1030,17 @@ static int config_parse(diskfile_backend *cfg_file, struct reader *reader, git_c
struct reader *r;
git_buf path = GIT_BUF_INIT;
char *dir;
+ uint32_t index;
r = git_array_alloc(cfg_file->readers);
+ /* The reader may have been reallocated */
+ reader = git_array_get(cfg_file->readers, reader_idx);
memset(r, 0, sizeof(struct reader));
if ((result = git_path_dirname_r(&path, reader->file_path)) < 0)
break;
+ /* We need to know out index in the array, as the next config_parse call may realloc */
+ index = git_array_size(cfg_file->readers) - 1;
dir = git_buf_detach(&path);
result = included_path(&path, dir, var->entry->value);
git__free(dir);
@@ -1047,6 +1055,7 @@ static int config_parse(diskfile_backend *cfg_file, struct reader *reader, git_c
break;
result = config_parse(cfg_file, r, level, depth+1);
+ r = git_array_get(cfg_file->readers, index);
git_buf_free(&r->buffer);
if (result < 0)