Commit 7c1ee212b7fa1568a12a0a656b02cae01cb1cb6c

Carlos Martín Nieto 2014-03-07T15:17:08

commit: simplify and correct refcounting in nth_gen_ancestor We can make use of git_object_dup to use refcounting instead of pointer comparison to make sure we don't free the caller's object. This also lets us simplify the case for '~0' which is now just an assignment instead of looking up the object we have at hand.

diff --git a/src/commit.c b/src/commit.c
index 2f5a5b5..255debe 100644
--- a/src/commit.c
+++ b/src/commit.c
@@ -455,19 +455,18 @@ int git_commit_nth_gen_ancestor(
 
 	assert(ancestor && commit);
 
-	current = (git_commit *)commit;
+	if (git_object_dup((git_object **) &current, (git_object *) commit) < 0)
+		return -1;
 
-	if (n == 0)
-		return git_commit_lookup(
-			ancestor,
-			commit->object.repo,
-			git_object_id((const git_object *)commit));
+	if (n == 0) {
+		*ancestor = current;
+		return 0;
+	}
 
 	while (n--) {
-		error = git_commit_parent(&parent, (git_commit *)current, 0);
+		error = git_commit_parent(&parent, current, 0);
 
-		if (current != commit)
-			git_commit_free(current);
+		git_commit_free(current);
 
 		if (error < 0)
 			return error;