Skip to content

Commit

Permalink
blame: handle error when resoling HEAD in normalize_options
Browse files Browse the repository at this point in the history
When normalizing options we try to look up HEAD's OID. While this
action may fail in malformed repositories we never check the
return value of the function.

Fix the issue by converting `normalize_options` to actually
return an error and handle the error in `git_blame_file`.
  • Loading branch information
pks-t committed Mar 11, 2016
1 parent 8a4a343 commit e850e98
Showing 1 changed file with 8 additions and 3 deletions.
11 changes: 8 additions & 3 deletions src/blame.c
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ const git_blame_hunk *git_blame_get_hunk_byline(git_blame *blame, size_t lineno)
return NULL;
}

static void normalize_options(
static int normalize_options(
git_blame_options *out,
const git_blame_options *in,
git_repository *repo)
Expand All @@ -190,7 +190,9 @@ static void normalize_options(

/* No newest_commit => HEAD */
if (git_oid_iszero(&out->newest_commit)) {
git_reference_name_to_id(&out->newest_commit, repo, "HEAD");
if (git_reference_name_to_id(&out->newest_commit, repo, "HEAD") < 0) {
return -1;
}
}

/* min_line 0 really means 1 */
Expand All @@ -204,6 +206,8 @@ static void normalize_options(
out->flags |= GIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES;
if (out->flags & GIT_BLAME_TRACK_COPIES_SAME_COMMIT_MOVES)
out->flags |= GIT_BLAME_TRACK_COPIES_SAME_FILE;

return 0;
}

static git_blame_hunk *split_hunk_in_vector(
Expand Down Expand Up @@ -362,7 +366,8 @@ int git_blame_file(
git_blame *blame = NULL;

assert(out && repo && path);
normalize_options(&normOptions, options, repo);
if ((error = normalize_options(&normOptions, options, repo)) < 0)
goto on_error;

blame = git_blame__alloc(repo, normOptions, path);
GITERR_CHECK_ALLOC(blame);
Expand Down

0 comments on commit e850e98

Please sign in to comment.