summaryrefslogtreecommitdiff
path: root/src/diff.c
diff options
context:
space:
mode:
authorCarlos Martín Nieto <carlos@cmartin.tk>2012-06-20 02:15:42 +0200
committerCarlos Martín Nieto <carlos@cmartin.tk>2012-06-20 02:22:07 +0200
commit1d94a7d0f6c8cb0d1fcf288a1734a7a5abd1b094 (patch)
tree58231eb02d976043ce644754c5920f934fbc52f8 /src/diff.c
parentc06e0003944cb14b8236d994794c2eabb8fad1d4 (diff)
downloadlibgit2-1d94a7d0f6c8cb0d1fcf288a1734a7a5abd1b094.tar.gz
diff: make sure we free all allocated resources
When the creation of one iterator fails, we need to free the prefix and possibly one of the iterators. Make sure we do so.
Diffstat (limited to 'src/diff.c')
-rw-r--r--src/diff.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/src/diff.c b/src/diff.c
index bc8708e33..4fea894f8 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -704,12 +704,17 @@ int git_diff_index_to_tree(
assert(repo && diff);
if (git_iterator_for_tree_range(&a, repo, old_tree, prefix, prefix) < 0 ||
- git_iterator_for_index_range(&b, repo, prefix, prefix) < 0)
- return -1;
+ git_iterator_for_index_range(&b, repo, prefix, prefix) < 0)
+ goto on_error;
git__free(prefix);
return diff_from_iterators(repo, opts, a, b, diff);
+
+on_error:
+ git__free(prefix);
+ git_iterator_free(a);
+ return -1;
}
int git_diff_workdir_to_index(
@@ -723,12 +728,17 @@ int git_diff_workdir_to_index(
assert(repo && diff);
if (git_iterator_for_index_range(&a, repo, prefix, prefix) < 0 ||
- git_iterator_for_workdir_range(&b, repo, prefix, prefix) < 0)
- return -1;
+ git_iterator_for_workdir_range(&b, repo, prefix, prefix) < 0)
+ goto on_error;
git__free(prefix);
return diff_from_iterators(repo, opts, a, b, diff);
+
+on_error:
+ git__free(prefix);
+ git_iterator_free(a);
+ return -1;
}
@@ -744,12 +754,17 @@ int git_diff_workdir_to_tree(
assert(repo && old_tree && diff);
if (git_iterator_for_tree_range(&a, repo, old_tree, prefix, prefix) < 0 ||
- git_iterator_for_workdir_range(&b, repo, prefix, prefix) < 0)
- return -1;
+ git_iterator_for_workdir_range(&b, repo, prefix, prefix) < 0)
+ goto on_error;
git__free(prefix);
return diff_from_iterators(repo, opts, a, b, diff);
+
+on_error:
+ git__free(prefix);
+ git_iterator_free(a);
+ return -1;
}
int git_diff_merge(