diff --git a/src/AbstractDiskWriter.cc b/src/AbstractDiskWriter.cc index 4d62bf97..a6191490 100644 --- a/src/AbstractDiskWriter.cc +++ b/src/AbstractDiskWriter.cc @@ -373,6 +373,13 @@ void AbstractDiskWriter::ensureMmapWrite(size_t len, int64_t offset) return; } + if (static_cast(std::numeric_limits::max()) < static_cast(filesize)) { + // filesize could overflow in 32bit OS with 64bit off_t type + // the filesize will be truncated if provided as a 32bit size_t + enableMmap_ = false; + return; + } + int errNum = 0; if (static_cast(len + offset) <= filesize) { #ifdef __MINGW32__ @@ -391,10 +398,14 @@ void AbstractDiskWriter::ensureMmapWrite(size_t len, int64_t offset) errNum = GetLastError(); } #else // !__MINGW32__ - mapaddr_ = reinterpret_cast(mmap( - nullptr, filesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd_, 0)); - if (!mapaddr_) { + void * pa = mmap(nullptr, filesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd_, 0); + + if (pa == MAP_FAILED) { errNum = errno; + mapaddr_ = nullptr; + } + else { + mapaddr_ = reinterpret_cast(pa); } #endif // !__MINGW32__ if (mapaddr_) {