diff --git a/src/mwindow.c b/src/mwindow.c index 0d6535056..1d64d26a4 100644 --- a/src/mwindow.c +++ b/src/mwindow.c @@ -62,11 +62,14 @@ int git_mwindow_get_pack(struct git_pack_file **out, const char *path) if ((error = git_packfile__name(&packname, path)) < 0) return error; - if (git_mutex_lock(&git__mwindow_mutex) < 0) + if (git_mutex_lock(&git__mwindow_mutex) < 0) { + giterr_set(GITERR_OS, "failed to lock mwindow mutex"); return -1; + } if (git_mwindow_files_init() < 0) { git_mutex_unlock(&git__mwindow_mutex); + git__free(packname); return -1; } @@ -93,31 +96,29 @@ int git_mwindow_get_pack(struct git_pack_file **out, const char *path) git_strmap_insert(git__pack_cache, pack->pack_name, pack, error); git_mutex_unlock(&git__mwindow_mutex); - if (error < 0) + if (error < 0) { + git_packfile_free(pack); return -1; + } *out = pack; return 0; } -int git_mwindow_put_pack(struct git_pack_file *pack) +void git_mwindow_put_pack(struct git_pack_file *pack) { int count; git_strmap_iter pos; if (git_mutex_lock(&git__mwindow_mutex) < 0) - return -1; + return; - if (git_mwindow_files_init() < 0) { - git_mutex_unlock(&git__mwindow_mutex); - return -1; - } + /* put before get would be a corrupted state */ + assert(git__pack_cache); pos = git_strmap_lookup_index(git__pack_cache, pack->pack_name); - if (!git_strmap_valid_index(git__pack_cache, pos)) { - git_mutex_unlock(&git__mwindow_mutex); - return GIT_ENOTFOUND; - } + /* if we cannot find it, the state is corrupted */ + assert(git_strmap_valid_index(git__pack_cache, pos)); count = git_atomic_dec(&pack->refcount); if (count == 0) { @@ -126,7 +127,7 @@ int git_mwindow_put_pack(struct git_pack_file *pack) } git_mutex_unlock(&git__mwindow_mutex); - return 0; + return; } void git_mwindow_free_all(git_mwindow_file *mwf) diff --git a/src/mwindow.h b/src/mwindow.h index 57fabae70..63418e458 100644 --- a/src/mwindow.h +++ b/src/mwindow.h @@ -48,6 +48,6 @@ void git_mwindow_files_free(void); struct git_pack_file; /* just declaration to avoid cyclical includes */ int git_mwindow_get_pack(struct git_pack_file **out, const char *path); -int git_mwindow_put_pack(struct git_pack_file *pack); +void git_mwindow_put_pack(struct git_pack_file *pack); #endif diff --git a/src/pack.c b/src/pack.c index 767efb6c3..22dbd5647 100644 --- a/src/pack.c +++ b/src/pack.c @@ -968,10 +968,10 @@ void git_packfile_free(struct git_pack_file *p) cache_free(&p->bases); - git_mwindow_free_all_locked(&p->mwf); - - if (p->mwf.fd >= 0) + if (p->mwf.fd >= 0) { + git_mwindow_free_all_locked(&p->mwf); p_close(p->mwf.fd); + } pack_index_free(p); diff --git a/src/tree.c b/src/tree.c index e0e2dbebf..28190d6da 100644 --- a/src/tree.c +++ b/src/tree.c @@ -466,6 +466,7 @@ static int append_entry( git_strmap_insert(bld->map, entry->filename, entry, error); if (error < 0) { + git_tree_entry_free(entry); giterr_set(GITERR_TREE, "failed to append entry %s to the tree builder", filename); return -1; } @@ -622,6 +623,7 @@ int git_treebuilder_create(git_treebuilder **builder_p, const git_tree *source) GITERR_CHECK_ALLOC(bld); if (git_strmap_alloc(&bld->map) < 0) { + git__free(bld); return -1; }