diff options
author | Carlos Martín Nieto <cmn@dwim.me> | 2014-05-08 16:24:54 +0200 |
---|---|---|
committer | Carlos Martín Nieto <cmn@dwim.me> | 2014-05-09 09:40:29 +0200 |
commit | e6d10c58b547181fe19f6bacff6bd0dee9f67b9b (patch) | |
tree | 1be9363b2d1a99d71750c209cdcb5c2a593b6bda /src/pack.c | |
parent | a332e91c92524cc21818eadfbe723361d31dc187 (diff) | |
download | libgit2-e6d10c58b547181fe19f6bacff6bd0dee9f67b9b.tar.gz |
pack: make sure not to leak the dep chain
Diffstat (limited to 'src/pack.c')
-rw-r--r-- | src/pack.c | 21 |
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; } |