summaryrefslogtreecommitdiff
path: root/src/pack.c
diff options
context:
space:
mode:
authorCarlos Martín Nieto <cmn@dwim.me>2014-05-08 16:24:54 +0200
committerCarlos Martín Nieto <cmn@dwim.me>2014-05-09 09:40:29 +0200
commite6d10c58b547181fe19f6bacff6bd0dee9f67b9b (patch)
tree1be9363b2d1a99d71750c209cdcb5c2a593b6bda /src/pack.c
parenta332e91c92524cc21818eadfbe723361d31dc187 (diff)
downloadlibgit2-e6d10c58b547181fe19f6bacff6bd0dee9f67b9b.tar.gz
pack: make sure not to leak the dep chain
Diffstat (limited to 'src/pack.c')
-rw-r--r--src/pack.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/src/pack.c b/src/pack.c
index c1d7592fd..a8577d389 100644
--- a/src/pack.c
+++ b/src/pack.c
@@ -1242,14 +1242,16 @@ static int pack_dependency_chain(git_dependency_chain *chain_out, struct git_pac
curpos = obj_offset;
elem = git_array_alloc(chain);
- if (!elem)
- return -1;
+ if (!elem) {
+ error = -1;
+ goto on_error;
+ }
error = git_packfile_unpack_header(&size, &type, &p->mwf, &w_curs, &curpos);
git_mwindow_close(&w_curs);
if (error < 0)
- return error;
+ goto on_error;
elem->cached = 0;
elem->offset = curpos;
@@ -1273,8 +1275,10 @@ static int pack_dependency_chain(git_dependency_chain *chain_out, struct git_pac
if (base_offset == 0)
return packfile_error("delta offset is zero");
- if (base_offset < 0) /* must actually be an error code */
- return (int)base_offset;
+ if (base_offset < 0) { /* must actually be an error code */
+ error = (int)base_offset;
+ goto on_error;
+ }
/* we need to pass the pos *after* the delta-base bit */
elem->offset = curpos;
@@ -1302,9 +1306,10 @@ static int pack_dependency_chain(git_dependency_chain *chain_out, struct git_pac
return packfile_error("after dependency chain loop; cannot happen");
}
- if (error < 0)
- git_array_clear(chain);
-
*chain_out = chain;
return error;
+
+on_error:
+ git_array_clear(chain);
+ return error;
}