Use lookup_commit instead of parse_object to look up commits mentioned
in the reflog. This avoids a segfault in save_parents if somehow a sha1
for something other than a commit ends up in the reflog.

Signed-off-by: Dennis Kaarsemaker <den...@kaarsemaker.net>
Helped-by: Nguyễn Thái Ngọc Duy <pclo...@gmail.com>
---
Duy Nguyen wrote:

> I would go with something like this. The typecasting to "struct commit
> *" is the bug because parse_object() can return any object type.

Yeah, that's much better. Here it is as a patch with a test. 

 reflog-walk.c     | 4 ++--
 t/t1410-reflog.sh | 6 ++++++
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/reflog-walk.c b/reflog-walk.c
index 85b8a54..b85c8e8 100644
--- a/reflog-walk.c
+++ b/reflog-walk.c
@@ -236,8 +236,8 @@ void fake_reflog_parent(struct reflog_walk_info *info, 
struct commit *commit)
        reflog = &commit_reflog->reflogs->items[commit_reflog->recno];
        info->last_commit_reflog = commit_reflog;
        commit_reflog->recno--;
-       commit_info->commit = (struct commit *)parse_object(reflog->osha1);
-       if (!commit_info->commit) {
+       commit_info->commit = lookup_commit(reflog->osha1);
+       if (!commit_info->commit || parse_commit(commit_info->commit)) {
                commit->parents = NULL;
                return;
        }
diff --git a/t/t1410-reflog.sh b/t/t1410-reflog.sh
index b79049f..76ccbe5 100755
--- a/t/t1410-reflog.sh
+++ b/t/t1410-reflog.sh
@@ -325,4 +325,10 @@ test_expect_success 'parsing reverse reflogs at BUFSIZ 
boundaries' '
        test_cmp expect actual
 '
 
+test_expect_success 'reflog containing non-commit sha1s' '
+       git checkout -b broken-reflog &&
+       echo "$(git rev-parse HEAD^{tree}) $(git rev-parse HEAD) abc <xyz> 
0000000001 +0000" >> .git/logs/refs/heads/broken-reflog &&
+       git reflog broken-reflog
+'
+
 test_done
-- 
2.7.0-rc1-207-ga35084c


-- 
Dennis Kaarsemaker <den...@kaarsemaker.net>
http://twitter.com/seveas
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to