aboutsummaryrefslogtreecommitdiff
path: root/reflog-walk.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2016-01-20 11:43:32 -0800
committerJunio C Hamano <gitster@pobox.com>2016-01-20 11:43:32 -0800
commitceef512e797115ae581cfbfd220334e20f1c7b28 (patch)
treebcb722598337cc1b9845172954de89432950dab8 /reflog-walk.c
parent1576f783425b9cb7f7e54839c4a66adb2e95afea (diff)
parentaecad374ae7492cc7b2add5fa416d43e1f68c18e (diff)
downloadgit-ceef512e797115ae581cfbfd220334e20f1c7b28.tar.gz
git-ceef512e797115ae581cfbfd220334e20f1c7b28.tar.xz
Merge branch 'dk/reflog-walk-with-non-commit'
"git reflog" incorrectly assumed that all objects that used to be at the tip of a ref must be commits, which caused it to segfault. * dk/reflog-walk-with-non-commit: reflog-walk: don't segfault on non-commit sha1's in the reflog
Diffstat (limited to 'reflog-walk.c')
-rw-r--r--reflog-walk.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/reflog-walk.c b/reflog-walk.c
index 85b8a5424..0ebd1da5c 100644
--- a/reflog-walk.c
+++ b/reflog-walk.c
@@ -221,6 +221,7 @@ void fake_reflog_parent(struct reflog_walk_info *info, struct commit *commit)
struct commit_info *commit_info =
get_commit_info(commit, &info->reflogs, 0);
struct commit_reflog *commit_reflog;
+ struct object *logobj;
struct reflog_info *reflog;
info->last_commit_reflog = NULL;
@@ -232,15 +233,20 @@ void fake_reflog_parent(struct reflog_walk_info *info, struct commit *commit)
commit->parents = NULL;
return;
}
-
- 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) {
+
+ do {
+ reflog = &commit_reflog->reflogs->items[commit_reflog->recno];
+ commit_reflog->recno--;
+ logobj = parse_object(reflog->osha1);
+ } while (commit_reflog->recno && (logobj && logobj->type != OBJ_COMMIT));
+
+ if (!logobj || logobj->type != OBJ_COMMIT) {
+ commit_info->commit = NULL;
commit->parents = NULL;
return;
}
+ commit_info->commit = (struct commit *)logobj;
commit->parents = xcalloc(1, sizeof(struct commit_list));
commit->parents->item = commit_info->commit;