diff options
author | Carlos Martín Nieto <cmn@elego.de> | 2011-07-26 12:26:12 +0200 |
---|---|---|
committer | Vicent Marti <tanoku@gmail.com> | 2011-09-27 14:33:18 +0200 |
commit | b183ffe77ee0f81d51019ed46cd10fa0a9a353ac (patch) | |
tree | 266b7d34953213211e8708ac1a5aed3addd74080 /src/tree-cache.c | |
parent | b41713206b83bdf88522ae789b56630bb6e0a4bc (diff) | |
download | libgit2-b183ffe77ee0f81d51019ed46cd10fa0a9a353ac.tar.gz |
Make tree cache name a flex-array
Signed-off-by: Carlos Martín Nieto <cmn@elego.de>
Diffstat (limited to 'src/tree-cache.c')
-rw-r--r-- | src/tree-cache.c | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/src/tree-cache.c b/src/tree-cache.c index b3e8a5824..9f1431258 100644 --- a/src/tree-cache.c +++ b/src/tree-cache.c @@ -14,12 +14,7 @@ static int read_tree_internal(git_tree_cache **out, const char *name_start, *buffer; int count; int error = GIT_SUCCESS; - - if ((tree = git__malloc(sizeof(git_tree_cache))) == NULL) - return GIT_ENOMEM; - - memset(tree, 0x0, sizeof(git_tree_cache)); - tree->parent = parent; + size_t name_len; buffer = name_start = *buffer_in; @@ -28,18 +23,22 @@ static int read_tree_internal(git_tree_cache **out, goto cleanup; } - /* NUL-terminated tree name */ - tree->name = git__strdup(name_start); - if (tree->name == NULL) { - error = GIT_ENOMEM; - goto cleanup; - } - if (++buffer >= buffer_end) { error = GIT_EOBJCORRUPTED; goto cleanup; } + name_len = strlen(name_start); + if ((tree = git__malloc(sizeof(git_tree_cache) + name_len + 1)) == NULL) + return GIT_ENOMEM; + + memset(tree, 0x0, sizeof(git_tree_cache)); + tree->parent = parent; + + /* NUL-terminated tree name */ + memcpy(tree->name, name_start, name_len); + tree->name[name_len] = '\0'; + /* Blank-terminated ASCII decimal number of entries in this tree */ if (git__strtol32(&count, buffer, &buffer, 10) < GIT_SUCCESS || count < -1) { error = GIT_EOBJCORRUPTED; @@ -135,7 +134,6 @@ void git_tree_cache_free(git_tree_cache *tree) for (i = 0; i < tree->children_count; ++i) git_tree_cache_free(tree->children[i]); - free(tree->name); free(tree->children); free(tree); } |