summaryrefslogtreecommitdiff
path: root/src/blame.c
diff options
context:
space:
mode:
authorJiri Pospisil <mekishizufu@gmail.com>2014-03-06 22:23:57 +0100
committerJiri Pospisil <mekishizufu@gmail.com>2014-03-07 15:52:34 +0100
commit79aa03020d1a2020b4189ad272ee603af34f0921 (patch)
tree2eb0fe6e68006f5f03c7f45762f5c0faac507fce /src/blame.c
parent00258cc0b6d54f8c5802b41089d9c6b74ba2f919 (diff)
downloadlibgit2-79aa03020d1a2020b4189ad272ee603af34f0921.tar.gz
blame: Fix compare function's data types
Previously the hunk_byfinalline_search_cmp function was called with different data types (size_t and uint32_t) for the key argument but expected only the former resulting in an invalid memory access when passed the latter on a 64 bit machine. The following patch makes sure that the function is called and works with the same type (size_t).
Diffstat (limited to 'src/blame.c')
-rw-r--r--src/blame.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/blame.c b/src/blame.c
index 01f88b729..e45c0ee1c 100644
--- a/src/blame.c
+++ b/src/blame.c
@@ -20,12 +20,15 @@
static int hunk_byfinalline_search_cmp(const void *key, const void *entry)
{
- uint16_t lineno = (uint16_t)*(size_t*)key;
git_blame_hunk *hunk = (git_blame_hunk*)entry;
- if (lineno < hunk->final_start_line_number)
+ 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;
+
+ if (lineno < final_start_line_number)
return -1;
- if (lineno >= hunk->final_start_line_number + hunk->lines_in_hunk)
+ if (lineno >= final_start_line_number + lines_in_hunk)
return 1;
return 0;
}
@@ -95,7 +98,7 @@ static void shift_hunks_by(git_vector *v, size_t start_line, int shift_by)
{
size_t i;
- if (!git_vector_bsearch2( &i, v, hunk_byfinalline_search_cmp, &start_line)) {
+ if (!git_vector_bsearch2(&i, v, hunk_byfinalline_search_cmp, &start_line)) {
for (; i < v->length; i++) {
git_blame_hunk *hunk = (git_blame_hunk*)v->contents[i];
hunk->final_start_line_number += shift_by;
@@ -161,10 +164,10 @@ const git_blame_hunk *git_blame_get_hunk_byindex(git_blame *blame, uint32_t inde
const git_blame_hunk *git_blame_get_hunk_byline(git_blame *blame, uint32_t lineno)
{
- size_t i;
+ size_t i, new_lineno = (size_t)lineno;
assert(blame);
- if (!git_vector_bsearch2( &i, &blame->hunks, hunk_byfinalline_search_cmp, &lineno)) {
+ if (!git_vector_bsearch2(&i, &blame->hunks, hunk_byfinalline_search_cmp, &new_lineno)) {
return git_blame_get_hunk_byindex(blame, (uint32_t)i);
}