summaryrefslogtreecommitdiffstats
path: root/src/server
diff options
context:
space:
mode:
authorSimon Rettberg2018-03-16 13:20:31 +0100
committerSimon Rettberg2018-03-16 13:20:31 +0100
commit6277648bf289fad6d5d00635d5657462432ce9c4 (patch)
treea32c2382ba5628568c254a5fcae52c67cff083b4 /src/server
parent[SERVER] Make sparse file mode actually work (diff)
downloaddnbd3-6277648bf289fad6d5d00635d5657462432ce9c4.tar.gz
dnbd3-6277648bf289fad6d5d00635d5657462432ce9c4.tar.xz
dnbd3-6277648bf289fad6d5d00635d5657462432ce9c4.zip
[SERVER] Fix int overflows on 32bit builds in CRC generation
Diffstat (limited to 'src/server')
-rw-r--r--src/server/image.c12
-rw-r--r--src/server/net.c2
2 files changed, 7 insertions, 7 deletions
diff --git a/src/server/image.c b/src/server/image.c
index cb01181..3823a36 100644
--- a/src/server/image.c
+++ b/src/server/image.c
@@ -691,7 +691,7 @@ static bool image_isHashBlockComplete(const uint8_t * const cacheMap, const uint
} else {
// Special case: Checking last block, which is smaller than HASH_BLOCK_SIZE
for (uint64_t mapPos = block * HASH_BLOCK_SIZE; mapPos < realFilesize; mapPos += DNBD3_BLOCK_SIZE ) {
- const size_t map_y = mapPos >> 15;
+ const size_t map_y = (size_t)( mapPos >> 15 );
const int map_x = (int)( (mapPos >> 12) & 7 ); // mod 8
const int mask = 1 << map_x;
if ( (cacheMap[map_y] & mask) == 0 ) return false;
@@ -1653,18 +1653,18 @@ static bool image_calcBlockCrc32(const int fd, const size_t block, const uint64_
{
char buffer[40000];
// How many bytes to read from the input file
- const size_t bytesFromFile = MIN( HASH_BLOCK_SIZE, realFilesize - ( block * HASH_BLOCK_SIZE) );
+ const uint64_t bytesFromFile = MIN( HASH_BLOCK_SIZE, realFilesize - ( block * HASH_BLOCK_SIZE) );
// Determine how many bytes we had to read if the file size were a multiple of 4k
// This might be the same value if the real file's size is a multiple of 4k
- const size_t vbs = ( ( realFilesize + ( DNBD3_BLOCK_SIZE - 1 ) ) & ~( DNBD3_BLOCK_SIZE - 1 ) ) - ( block * HASH_BLOCK_SIZE );
- const size_t virtualBytesFromFile = MIN( HASH_BLOCK_SIZE, vbs );
+ const uint64_t vbs = ( ( realFilesize + ( DNBD3_BLOCK_SIZE - 1 ) ) & ~( DNBD3_BLOCK_SIZE - 1 ) ) - ( block * HASH_BLOCK_SIZE );
+ const uint64_t virtualBytesFromFile = MIN( HASH_BLOCK_SIZE, vbs );
const off_t readPos = (int64_t)block * HASH_BLOCK_SIZE;
size_t bytes = 0;
assert( vbs >= bytesFromFile );
*crc = crc32( 0, NULL, 0 );
// Calculate the crc32 by reading data from the file
while ( bytes < bytesFromFile ) {
- const size_t n = MIN( sizeof(buffer), bytesFromFile - bytes );
+ const size_t n = (size_t)MIN( sizeof(buffer), bytesFromFile - bytes );
const ssize_t r = pread( fd, buffer, n, readPos + bytes );
if ( r <= 0 ) {
logadd( LOG_WARNING, "CRC: Read error (errno=%d)", errno );
@@ -1676,7 +1676,7 @@ static bool image_calcBlockCrc32(const int fd, const size_t block, const uint64_
// If the virtual file size is different, keep going using nullbytes
if ( bytesFromFile < virtualBytesFromFile ) {
memset( buffer, 0, sizeof(buffer) );
- bytes = virtualBytesFromFile - bytesFromFile;
+ bytes = (size_t)( virtualBytesFromFile - bytesFromFile );
while ( bytes != 0 ) {
const size_t len = MIN( sizeof(buffer), bytes );
*crc = crc32( *crc, (uint8_t*)buffer, len );
diff --git a/src/server/net.c b/src/server/net.c
index c081d32..b160778 100644
--- a/src/server/net.c
+++ b/src/server/net.c
@@ -436,7 +436,7 @@ void* net_handleNewConnection(void *clientPtr)
if ( offset + request.size <= image->realFilesize ) {
realBytes = request.size;
} else {
- realBytes = image->realFilesize - offset;
+ realBytes = (size_t)(image->realFilesize - offset);
}
while ( done < realBytes ) {
// TODO: Should we consider EOPNOTSUPP on BSD for sendfile and fallback to read/write?