Fix a bunch of leaks, error handling cases
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
diff --git a/src/graph.c b/src/graph.c
index 2fc50ea..e61fc84 100644
--- a/src/graph.c
+++ b/src/graph.c
@@ -32,7 +32,6 @@ static int interesting(git_pqueue *list, git_commit_list *roots)
static int mark_parents(git_revwalk *walk, git_commit_list_node *one,
git_commit_list_node *two)
{
- int error;
unsigned int i;
git_commit_list *roots = NULL;
git_pqueue list;
@@ -47,16 +46,16 @@ static int mark_parents(git_revwalk *walk, git_commit_list_node *one,
return -1;
if (git_commit_list_parse(walk, one) < 0)
- return -1;
+ goto on_error;
one->flags |= PARENT1;
if (git_pqueue_insert(&list, one) < 0)
- return -1;
+ goto on_error;
if (git_commit_list_parse(walk, two) < 0)
- return -1;
+ goto on_error;
two->flags |= PARENT2;
if (git_pqueue_insert(&list, two) < 0)
- return -1;
+ goto on_error;
/* as long as there are non-STALE commits */
while (interesting(&list, roots)) {
@@ -80,25 +79,29 @@ static int mark_parents(git_revwalk *walk, git_commit_list_node *one,
if ((p->flags & flags) == flags)
continue;
- if ((error = git_commit_list_parse(walk, p)) < 0)
- return error;
+ if (git_commit_list_parse(walk, p) < 0)
+ goto on_error;
p->flags |= flags;
if (git_pqueue_insert(&list, p) < 0)
- return -1;
+ goto on_error;
}
+ /* Keep track of root commits, to make sure the path gets marked */
if (commit->out_degree == 0) {
if (git_commit_list_insert(commit, &roots) == NULL)
- return -1;
+ goto on_error;
}
}
- if (roots)
- git_commit_list_free(&roots);
+ git_commit_list_free(&roots);
git_pqueue_free(&list);
-
return 0;
+
+on_error:
+ git_commit_list_free(&roots);
+ git_pqueue_free(&list);
+ return -1;
}