diff options
author | Carlos Martín Nieto <cmn@dwim.me> | 2014-02-04 21:35:44 +0100 |
---|---|---|
committer | Carlos Martín Nieto <cmn@dwim.me> | 2014-02-05 12:07:56 +0100 |
commit | 1202c7eaa6f0fd6407bc386881edd686771fc0f4 (patch) | |
tree | ad59a94322d6578ffbb074d2d7cd2a60df2f9c9a | |
parent | fc4728e3e2a4094b202a63319232f25adbd55fed (diff) | |
download | libgit2-1202c7eaa6f0fd6407bc386881edd686771fc0f4.tar.gz |
refs: fix leak on successful update
Free the old ref even on success.
-rw-r--r-- | src/refdb_fs.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/src/refdb_fs.c b/src/refdb_fs.c index 0a2a33a51..554fe42c9 100644 --- a/src/refdb_fs.c +++ b/src/refdb_fs.c @@ -941,7 +941,7 @@ static int refdb_fs_backend__write( refdb_fs_backend *backend = (refdb_fs_backend *)_backend; git_filebuf file = GIT_FILEBUF_INIT; git_reference *old_ref; - int error = 0; + int error = 0, cmp; assert(backend); @@ -954,19 +954,20 @@ static int refdb_fs_backend__write( return error; if (old_id) { - if ((error = refdb_fs_backend__lookup(&old_ref, _backend, ref->name)) < 0) { - git_filebuf_cleanup(&file); - return error; - } + if ((error = refdb_fs_backend__lookup(&old_ref, _backend, ref->name)) < 0) + goto on_error; if (old_ref->type == GIT_REF_SYMBOLIC) { + git_reference_free(old_ref); giterr_set(GITERR_REFERENCE, "cannot compare id to symbolic reference target"); error = -1; goto on_error; } /* Finally we can compare the ids */ - if (git_oid_cmp(old_id, &old_ref->target.oid)) { + cmp = git_oid_cmp(old_id, &old_ref->target.oid); + git_reference_free(old_ref); + if (cmp) { giterr_set(GITERR_REFERENCE, "old reference value does not match"); error = GIT_EMODIFIED; goto on_error; @@ -983,7 +984,6 @@ static int refdb_fs_backend__write( on_error: git_filebuf_cleanup(&file); - git_reference_free(old_ref); return error; } |