rem: if ((run.length << blockShift) > length) {
add: if (uint32(run.length << blockShift) > length) {
context: Stream<Cache>::ReadAt(off_t pos, uint8 *buffer, size_t *_length){	// set/check boundaries for pos/length	if (pos < 0)		pos = 0;	else if (pos >= Node()->data.size) {		*_length = 0;		return B_NO_ERROR;	}	size_t length = *_length;	if (pos + length > Node()->data.size)		length = Node()->data.size - pos;	block_run run;	off_t offset;	if (FindBlockRun(pos, run, offset) < B_OK) {		*_length = 0;		RETURN_ERROR(B_BAD_VALUE);	}	uint32 bytesRead = 0;	uint32 blockSize = fVolume->BlockSize();	uint32 blockShift = fVolume->BlockShift();	uint8 *block;	// the first block_run we read could not be aligned to the block_size boundary	// (read partial block at the beginning)	// pos % block_size == (pos - offset) % block_size, offset % block_size == 0	if (pos % blockSize != 0) {		run.start += (pos - offset) / blockSize;		run.length -= (pos - offset) / blockSize;		Cache cached(fVolume,run);		if ((block = cached.Block()) == NULL) {			*_length = 0;			RETURN_ERROR(B_BAD_VALUE);		}		bytesRead = blockSize - (pos % blockSize);		if (length < bytesRead)			bytesRead = length;		memcpy(buffer, block + (pos % blockSize), bytesRead);		pos += bytesRead;		length -= bytesRead;		if (length == 0) {			*_length = bytesRead;			return B_OK;		}		if (FindBlockRun(pos, run, offset) < B_OK) {			*_length = bytesRead;			RETURN_ERROR(B_BAD_VALUE);		}	}	// the first block_run is already filled in at this point	// read the following complete blocks using cached_read(),	// the last partial block is read using the generic Cache class	bool partial = false;	while (length > 0) {		// offset is the offset to the current pos in the block_run		run.start += (pos - offset) >> blockShift;		run.length -= (pos - offset) >> blockShift;		if ((run.length << blockShift) > length) {			if (length < blockSize) {				Cache cached(fVolume, run);				if ((block = cached.Block()) == NULL) {					*_length = bytesRead;					RETURN_ERROR(B_BAD_VALUE);				}				memcpy(buffer + bytesRead, block, length);				bytesRead += length;				break;			}			run.length = length >> blockShift;			partial = true;		}		if (Cache::Read(fVolume, run, buffer + bytesRead) < B_OK) {			*_length = bytesRead;			RETURN_ERROR(B_BAD_VALUE);		}		int32 bytes = run.length << blockShift;		length -= bytes;		bytesRead += bytes;		if (length == 0)			break;		pos += bytes;		if (partial) {			// if the last block was read only partially, point block_run			// to the remaining part			run.start += run.length;			run.length = 1;			offset = pos;		} else if (FindBlockRun(pos, run, offset) < B_OK) {			*_length = bytesRead;			RETURN_ERROR(B_BAD_VALUE);		}	}	*_length = bytesRead;	return B_NO_ERROR;}