Ver código fonte

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

Tatsuhiro Tsujikawa 14 anos atrás
pai
commit
a21fb350a0
2 arquivos alterados com 12 adições e 0 exclusões
  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";