From dc49cd769b5fa6b7e0114b051c34a849828a7603 Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Tue, 6 Mar 2007 20:44:37 -0500 Subject: 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 Signed-off-by: Junio C Hamano --- read-cache.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'read-cache.c') diff --git a/read-cache.c b/read-cache.c index 4a972b4ab7..6339a278da 100644 --- a/read-cache.c +++ b/read-cache.c @@ -66,7 +66,7 @@ static int ce_compare_data(struct cache_entry *ce, struct stat *st) return match; } -static int ce_compare_link(struct cache_entry *ce, unsigned long expected_size) +static int ce_compare_link(struct cache_entry *ce, size_t expected_size) { int match = -1; char *target; @@ -101,7 +101,7 @@ static int ce_modified_check_fs(struct cache_entry *ce, struct stat *st) return DATA_CHANGED; break; case S_IFLNK: - if (ce_compare_link(ce, st->st_size)) + if (ce_compare_link(ce, xsize_t(st->st_size))) return DATA_CHANGED; break; default: @@ -797,7 +797,7 @@ int read_cache_from(const char *path) } if (!fstat(fd, &st)) { - cache_mmap_size = st.st_size; + cache_mmap_size = xsize_t(st.st_size); errno = EINVAL; if (cache_mmap_size >= sizeof(struct cache_header) + 20) cache_mmap = xmmap(NULL, cache_mmap_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); -- cgit v1.2.3