summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVicent Marti <vicent@github.com>2014-06-25 21:43:52 +0200
committerVicent Marti <vicent@github.com>2014-06-25 21:43:52 +0200
commit86cb34cb110c6a1ec6e1d1525418c70f2f617d6b (patch)
treefe3b26bdc719e7a74083476007b1a2fc326f8ee3
parentc61dc1a92e6d7fed6da158b430c206480c1439d7 (diff)
parentc19b1c0442b52e07f1c9f48b65ef0b3823eaa526 (diff)
downloadlibgit2-86cb34cb110c6a1ec6e1d1525418c70f2f617d6b.tar.gz
Merge pull request #2442 from libgit2/cmn/leaks
Fix a couple of leaks
-rw-r--r--src/mwindow.c27
-rw-r--r--src/mwindow.h2
-rw-r--r--src/pack.c6
-rw-r--r--src/tree.c2
4 files changed, 20 insertions, 17 deletions
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;
}