فهرست منبع

Fixed the bug that causes segmentation fault when unpause RequestGroup
which has resolved BtDependency.

Tatsuhiro Tsujikawa 14 سال پیش
والد
کامیت
a21fb350a0
2فایلهای تغییر یافته به همراه12 افزوده شده و 0 حذف شده
  1. 3 0
      src/BtDependency.cc
  2. 9 0
      test/BtDependencyTest.cc

+ 3 - 0
src/BtDependency.cc

@@ -76,6 +76,9 @@ void copyValues(const SharedHandle<FileEntry>& d,
 
 bool BtDependency::resolve()
 {
+  if(!dependee_) {
+    return true;
+  }
   if(dependee_->getNumCommand() == 0 && dependee_->downloadFinished()) {
     SharedHandle<RequestGroup> dependee = dependee_;
     // cut reference here

+ 9 - 0
test/BtDependencyTest.cc

@@ -25,6 +25,7 @@ class BtDependencyTest:public CppUnit::TestFixture {
 
   CPPUNIT_TEST_SUITE(BtDependencyTest);
   CPPUNIT_TEST(testResolve);
+  CPPUNIT_TEST(testResolve_nullDependee);
   CPPUNIT_TEST(testResolve_originalNameNoMatch);
   CPPUNIT_TEST(testResolve_singleFileWithoutOriginalName);
   CPPUNIT_TEST(testResolve_multiFile);
@@ -71,6 +72,7 @@ public:
   }
 
   void testResolve();
+  void testResolve_nullDependee();
   void testResolve_originalNameNoMatch();
   void testResolve_singleFileWithoutOriginalName();
   void testResolve_multiFile();
@@ -106,6 +108,13 @@ void BtDependencyTest::testResolve()
   CPPUNIT_ASSERT(firstFileEntry->isRequested());
 }
 
+void BtDependencyTest::testResolve_nullDependee()
+{
+  SharedHandle<RequestGroup> dependant = createDependant(option_);
+  BtDependency dep(dependant.get(), SharedHandle<RequestGroup>());
+  CPPUNIT_ASSERT(dep.resolve());
+}
+
 void BtDependencyTest::testResolve_originalNameNoMatch()
 {
   std::string filename = A2_TEST_DIR"/single.torrent";