diff options
author | Shawn O. Pearce <spearce@spearce.org> | 2007-03-06 20:44:37 -0500 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2007-03-07 11:15:26 -0800 |
commit | dc49cd769b5fa6b7e0114b051c34a849828a7603 (patch) | |
tree | 7eafafcd36ab731599da3fb5e59d3f4379c342d3 /diffcore-rename.c | |
parent | 6777a59fcdfd96b9ca5cba49cb265c6c47de3d02 (diff) | |
download | git-dc49cd769b5fa6b7e0114b051c34a849828a7603.tar.gz |
Cast 64 bit off_t to 32 bit size_t
Some systems have sizeof(off_t) == 8 while sizeof(size_t) == 4.
This implies that we are able to access and work on files whose
maximum length is around 2^63-1 bytes, but we can only malloc or
mmap somewhat less than 2^32-1 bytes of memory.
On such a system an implicit conversion of off_t to size_t can cause
the size_t to wrap, resulting in unexpected and exciting behavior.
Right now we are working around all gcc warnings generated by the
-Wshorten-64-to-32 option by passing the off_t through xsize_t().
In the future we should make xsize_t on such problematic platforms
detect the wrapping and die if such a file is accessed.
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'diffcore-rename.c')
-rw-r--r-- | diffcore-rename.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/diffcore-rename.c b/diffcore-rename.c index 91fa2bea51..79030412db 100644 --- a/diffcore-rename.c +++ b/diffcore-rename.c @@ -172,7 +172,8 @@ static int estimate_similarity(struct diff_filespec *src, return 0; /* error but caught downstream */ - delta_limit = base_size * (MAX_SCORE-minimum_score) / MAX_SCORE; + delta_limit = (unsigned long) + (base_size * (MAX_SCORE-minimum_score) / MAX_SCORE); if (diffcore_count_changes(src->data, src->size, dst->data, dst->size, &src->cnt_data, &dst->cnt_data, @@ -186,7 +187,7 @@ static int estimate_similarity(struct diff_filespec *src, if (!dst->size) score = 0; /* should not happen */ else - score = src_copied * MAX_SCORE / max_size; + score = (int)(src_copied * MAX_SCORE / max_size); return score; } @@ -297,7 +298,7 @@ void diffcore_rename(struct diff_options *options) struct diff_filespec *one = rename_src[j].one; if (!is_exact_match(one, two, contents_too)) continue; - record_rename_pair(i, j, MAX_SCORE); + record_rename_pair(i, j, (int)MAX_SCORE); rename_count++; break; /* we are done with this entry */ } |