Commit 86cb34cb110c6a1ec6e1d1525418c70f2f617d6b

Vicent Marti 2014-06-25T21:43:52

Merge pull request #2442 from libgit2/cmn/leaks Fix a couple of leaks

diff --git a/src/mwindow.c b/src/mwindow.c
index 0d65350..1d64d26 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 57fabae..63418e4 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 767efb6..22dbd56 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 e0e2dbe..28190d6 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;
 	}