Explorar o código

Merge branch 'fix-mmap-check' of https://github.com/c3V6a2Vy/aria2 into c3V6a2Vy-fix-mmap-check

Tatsuhiro Tsujikawa %!s(int64=9) %!d(string=hai) anos
pai
achega
eac72b9045
Modificáronse 1 ficheiros con 14 adicións e 3 borrados
  1. 14 3
      src/AbstractDiskWriter.cc

+ 14 - 3
src/AbstractDiskWriter.cc

@@ -373,6 +373,13 @@ void AbstractDiskWriter::ensureMmapWrite(size_t len, int64_t offset)
         return;
       }
 
+      if (static_cast<uint64_t>(std::numeric_limits<size_t>::max()) < static_cast<uint64_t>(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<int64_t>(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<unsigned char*>(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<unsigned char*>(pa);
         }
 #endif // !__MINGW32__
         if (mapaddr_) {