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 <dennis@xxxxxxxxxxxxxxx> Helped-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- 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 <dennis@xxxxxxxxxxxxxxx> http://twitter.com/seveas -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html