summaryrefslogtreecommitdiff
path: root/src/index.c
diff options
context:
space:
mode:
authorCarlos Martín Nieto <cmn@elego.de>2011-05-24 15:24:45 +0200
committerVicent Marti <tanoku@gmail.com>2011-06-01 18:54:56 +0200
commita02fc2cd16b5d45466733a1c4f027def4f5ee24c (patch)
tree3c65d99b63d66003340095bc912864631ed35dff /src/index.c
parentcdd9fd473ec96766897fab73c1837c178619409f (diff)
downloadlibgit2-a02fc2cd16b5d45466733a1c4f027def4f5ee24c.tar.gz
index: correctly parse invalidated TREE extensions
A TREE extension with an entry count of -1 means that it was invalidated and we should ignore it. Do so instead of returning an error. This fixes issue #202 Signed-off-by: Carlos Martín Nieto <cmn@elego.de>
Diffstat (limited to 'src/index.c')
-rw-r--r--src/index.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/index.c b/src/index.c
index 0da2e18b8..b49ed196d 100644
--- a/src/index.c
+++ b/src/index.c
@@ -520,11 +520,20 @@ static int read_tree_internal(git_index_tree **out,
/* Blank-terminated ASCII decimal number of entries in this tree */
if (git__strtol32(&count, buffer, &buffer, 10) < GIT_SUCCESS ||
- count < 0) {
+ count < -1) {
error = GIT_EOBJCORRUPTED;
goto exit;
}
+ /* Invalidated TREE. Free the tree but report success */
+ if (count == -1) {
+ buffer = buffer_end;
+ free_tree(tree); /* Needs to be done manually */
+ tree = NULL;
+ error = GIT_SUCCESS;
+ goto exit;
+ }
+
tree->entries = (size_t)count;
if (*buffer != ' ' || ++buffer >= buffer_end) {