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>
This commit is contained in:

committed by
Junio C Hamano

parent
6777a59fcd
commit
dc49cd769b
@ -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 */
|
||||
}
|
||||
|
Reference in New Issue
Block a user