Commit 86cb34cb by Vicent Marti

Merge pull request #2442 from libgit2/cmn/leaks

Fix a couple of leaks
parents c61dc1a9 c19b1c04
...@@ -62,11 +62,14 @@ int git_mwindow_get_pack(struct git_pack_file **out, const char *path) ...@@ -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) if ((error = git_packfile__name(&packname, path)) < 0)
return error; 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; return -1;
}
if (git_mwindow_files_init() < 0) { if (git_mwindow_files_init() < 0) {
git_mutex_unlock(&git__mwindow_mutex); git_mutex_unlock(&git__mwindow_mutex);
git__free(packname);
return -1; return -1;
} }
...@@ -93,31 +96,29 @@ int git_mwindow_get_pack(struct git_pack_file **out, const char *path) ...@@ -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_strmap_insert(git__pack_cache, pack->pack_name, pack, error);
git_mutex_unlock(&git__mwindow_mutex); git_mutex_unlock(&git__mwindow_mutex);
if (error < 0) if (error < 0) {
git_packfile_free(pack);
return -1; return -1;
}
*out = pack; *out = pack;
return 0; return 0;
} }
int git_mwindow_put_pack(struct git_pack_file *pack) void git_mwindow_put_pack(struct git_pack_file *pack)
{ {
int count; int count;
git_strmap_iter pos; git_strmap_iter pos;
if (git_mutex_lock(&git__mwindow_mutex) < 0) if (git_mutex_lock(&git__mwindow_mutex) < 0)
return -1; return;
if (git_mwindow_files_init() < 0) { /* put before get would be a corrupted state */
git_mutex_unlock(&git__mwindow_mutex); assert(git__pack_cache);
return -1;
}
pos = git_strmap_lookup_index(git__pack_cache, pack->pack_name); pos = git_strmap_lookup_index(git__pack_cache, pack->pack_name);
if (!git_strmap_valid_index(git__pack_cache, pos)) { /* if we cannot find it, the state is corrupted */
git_mutex_unlock(&git__mwindow_mutex); assert(git_strmap_valid_index(git__pack_cache, pos));
return GIT_ENOTFOUND;
}
count = git_atomic_dec(&pack->refcount); count = git_atomic_dec(&pack->refcount);
if (count == 0) { if (count == 0) {
...@@ -126,7 +127,7 @@ int git_mwindow_put_pack(struct git_pack_file *pack) ...@@ -126,7 +127,7 @@ int git_mwindow_put_pack(struct git_pack_file *pack)
} }
git_mutex_unlock(&git__mwindow_mutex); git_mutex_unlock(&git__mwindow_mutex);
return 0; return;
} }
void git_mwindow_free_all(git_mwindow_file *mwf) void git_mwindow_free_all(git_mwindow_file *mwf)
......
...@@ -48,6 +48,6 @@ void git_mwindow_files_free(void); ...@@ -48,6 +48,6 @@ void git_mwindow_files_free(void);
struct git_pack_file; /* just declaration to avoid cyclical includes */ 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_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 #endif
...@@ -968,10 +968,10 @@ void git_packfile_free(struct git_pack_file *p) ...@@ -968,10 +968,10 @@ void git_packfile_free(struct git_pack_file *p)
cache_free(&p->bases); cache_free(&p->bases);
if (p->mwf.fd >= 0) {
git_mwindow_free_all_locked(&p->mwf); git_mwindow_free_all_locked(&p->mwf);
if (p->mwf.fd >= 0)
p_close(p->mwf.fd); p_close(p->mwf.fd);
}
pack_index_free(p); pack_index_free(p);
......
...@@ -466,6 +466,7 @@ static int append_entry( ...@@ -466,6 +466,7 @@ static int append_entry(
git_strmap_insert(bld->map, entry->filename, entry, error); git_strmap_insert(bld->map, entry->filename, entry, error);
if (error < 0) { if (error < 0) {
git_tree_entry_free(entry);
giterr_set(GITERR_TREE, "failed to append entry %s to the tree builder", filename); giterr_set(GITERR_TREE, "failed to append entry %s to the tree builder", filename);
return -1; return -1;
} }
...@@ -622,6 +623,7 @@ int git_treebuilder_create(git_treebuilder **builder_p, const git_tree *source) ...@@ -622,6 +623,7 @@ int git_treebuilder_create(git_treebuilder **builder_p, const git_tree *source)
GITERR_CHECK_ALLOC(bld); GITERR_CHECK_ALLOC(bld);
if (git_strmap_alloc(&bld->map) < 0) { if (git_strmap_alloc(&bld->map) < 0) {
git__free(bld);
return -1; return -1;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment