summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;
}