summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2015-11-24 10:18:58 +0100
committerPatrick Steinhardt <ps@pks.im>2015-12-01 09:02:47 +0100
commitcb1cb24ca9588e43edfb8b37e008c2e83af580af (patch)
tree16ae98aa4378f1ebd31f01536bd2184a68013bb8 /src
parent337b2b08f46ea77d61fa66657ad62d8702bc233a (diff)
downloadlibgit2-cb1cb24ca9588e43edfb8b37e008c2e83af580af.tar.gz
blame: use size_t for line counts in git_blame_hunk
It is not unreasonable to have versioned files with a line count exceeding 2^16. Upon blaming such files we fail to correctly keep track of the lines as `git_blame_hunk` stores them in `uint16_t` fields. Fix this by converting the line fields of `git_blame_hunk` to `size_t`. Add test to verify behavior.
Diffstat (limited to 'src')
-rw-r--r--src/blame.c24
1 files changed, 12 insertions, 12 deletions
diff --git a/src/blame.c b/src/blame.c
index 08a90dcfd..2daf91591 100644
--- a/src/blame.c
+++ b/src/blame.c
@@ -23,8 +23,8 @@ static int hunk_byfinalline_search_cmp(const void *key, const void *entry)
git_blame_hunk *hunk = (git_blame_hunk*)entry;
size_t lineno = *(size_t*)key;
- size_t lines_in_hunk = (size_t)hunk->lines_in_hunk;
- size_t final_start_line_number = (size_t)hunk->final_start_line_number;
+ size_t lines_in_hunk = hunk->lines_in_hunk;
+ size_t final_start_line_number = hunk->final_start_line_number;
if (lineno < final_start_line_number)
return -1;
@@ -44,7 +44,7 @@ static int hunk_cmp(const void *_a, const void *_b)
static bool hunk_ends_at_or_before_line(git_blame_hunk *hunk, size_t line)
{
- return line >= (size_t)(hunk->final_start_line_number + hunk->lines_in_hunk - 1);
+ return line >= (hunk->final_start_line_number + hunk->lines_in_hunk - 1);
}
static bool hunk_starts_at_or_after_line(git_blame_hunk *hunk, size_t line)
@@ -53,9 +53,9 @@ static bool hunk_starts_at_or_after_line(git_blame_hunk *hunk, size_t line)
}
static git_blame_hunk* new_hunk(
- uint16_t start,
- uint16_t lines,
- uint16_t orig_start,
+ size_t start,
+ size_t lines,
+ size_t orig_start,
const char *path)
{
git_blame_hunk *hunk = git__calloc(1, sizeof(git_blame_hunk));
@@ -166,9 +166,9 @@ const git_blame_hunk *git_blame_get_hunk_byindex(git_blame *blame, uint32_t inde
return (git_blame_hunk*)git_vector_get(&blame->hunks, index);
}
-const git_blame_hunk *git_blame_get_hunk_byline(git_blame *blame, uint32_t lineno)
+const git_blame_hunk *git_blame_get_hunk_byline(git_blame *blame, size_t lineno)
{
- size_t i, new_lineno = (size_t)lineno;
+ size_t i, new_lineno = lineno;
assert(blame);
if (!git_vector_bsearch2(&i, &blame->hunks, hunk_byfinalline_search_cmp, &new_lineno)) {
@@ -223,8 +223,8 @@ static git_blame_hunk *split_hunk_in_vector(
}
new_line_count = hunk->lines_in_hunk - rel_line;
- nh = new_hunk((uint16_t)(hunk->final_start_line_number+rel_line), (uint16_t)new_line_count,
- (uint16_t)(hunk->orig_start_line_number+rel_line), hunk->orig_path);
+ nh = new_hunk(hunk->final_start_line_number + rel_line, new_line_count,
+ hunk->orig_start_line_number + rel_line, hunk->orig_path);
if (!nh)
return NULL;
@@ -233,7 +233,7 @@ static git_blame_hunk *split_hunk_in_vector(
git_oid_cpy(&nh->orig_commit_id, &hunk->orig_commit_id);
/* Adjust hunk that was split */
- hunk->lines_in_hunk -= (uint16_t)new_line_count;
+ hunk->lines_in_hunk -= new_line_count;
git_vector_insert_sorted(vec, nh, NULL);
{
git_blame_hunk *ret = return_new ? nh : hunk;
@@ -442,7 +442,7 @@ static int buffer_line_cb(
} else {
/* Create a new buffer-blame hunk with this line */
shift_hunks_by(&blame->hunks, blame->current_diff_line, 1);
- blame->current_hunk = new_hunk((uint16_t)blame->current_diff_line, 1, 0, blame->path);
+ blame->current_hunk = new_hunk(blame->current_diff_line, 1, 0, blame->path);
GITERR_CHECK_ALLOC(blame->current_hunk);
git_vector_insert_sorted(&blame->hunks, blame->current_hunk, NULL);