Browse Source

Fix crash in OpenedFileCounter::ensureMaxOpenFileLimit()

The crash happens if PieceStorage and/or DiskAdaptor are not
initialized in one of active RequestGroups.
Tatsuhiro Tsujikawa 11 năm trước cách đây
mục cha
commit
e74b39deaf
1 tập tin đã thay đổi với 22 bổ sung2 xóa
  1. 22 2
      src/OpenedFileCounter.cc

+ 22 - 2
src/OpenedFileCounter.cc

@@ -71,12 +71,32 @@ void OpenedFileCounter::ensureMaxOpenFileLimit(size_t numNewFiles)
   std::advance(mark,
                SimpleRandomizer::getInstance()->
                getRandomNumber(requestGroups.size()));
+
+  auto closeFun = [&left](const std::shared_ptr<RequestGroup>& group)
+    {
+      auto& ps = group->getPieceStorage();
+
+      if(!ps) {
+        return;
+      }
+
+      auto diskAdaptor = ps->getDiskAdaptor();
+
+      if(!diskAdaptor) {
+        return;
+      }
+
+      left -= diskAdaptor->tryCloseFile(left);
+    };
+
   for(auto i = mark; i != std::end(requestGroups) && left > 0; ++i) {
-    left -= (*i)->getPieceStorage()->getDiskAdaptor()->tryCloseFile(left);
+    closeFun(*i);
   }
+
   for(auto i = std::begin(requestGroups); i != mark && left > 0; ++i) {
-    left -= (*i)->getPieceStorage()->getDiskAdaptor()->tryCloseFile(left);
+    closeFun(*i);
   }
+
   assert(left == 0);
   numOpenFiles_ += numNewFiles - numClose;
 }