Browse Source

2010-08-04 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

	Don't use pre-calculate hash value when end-game mode.  Throw
	exception if bad piece is received.
	* src/BtPieceMessage.cc
	* src/DownloadCommand.cc
Tatsuhiro Tsujikawa 15 years ago
parent
commit
dfdf2d8e56
3 changed files with 18 additions and 2 deletions
  1. 7 0
      ChangeLog
  2. 2 1
      src/BtPieceMessage.cc
  3. 9 1
      src/DownloadCommand.cc

+ 7 - 0
ChangeLog

@@ -1,3 +1,10 @@
+2010-08-04  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
+
+	Don't use pre-calculate hash value when end-game mode.  Throw
+	exception if bad piece is received.
+	* src/BtPieceMessage.cc
+	* src/DownloadCommand.cc
+
 2010-08-04  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 
 	Rewritten ut_pex peer selection.

+ 2 - 1
src/BtPieceMessage.cc

@@ -128,6 +128,7 @@ void BtPieceMessage::doReceivedAction()
         onNewPiece(piece);
       } else {
         onWrongPiece(piece);
+        throw DL_ABORT_EX("Bad piece hash.");
       }
     }
   } else {
@@ -221,7 +222,7 @@ std::string BtPieceMessage::toString() const
 
 bool BtPieceMessage::checkPieceHash(const SharedHandle<Piece>& piece)
 {
-  if(piece->isHashCalculated()) {
+  if(!getPieceStorage()->isEndGame() && piece->isHashCalculated()) {
     if(getLogger()->debug()) {
       getLogger()->debug("Hash is available!! index=%lu",
                          static_cast<unsigned long>(piece->getIndex()));

+ 9 - 1
src/DownloadCommand.cc

@@ -64,6 +64,9 @@
 #ifdef ENABLE_MESSAGE_DIGEST
 # include "MessageDigestHelper.h"
 #endif // ENABLE_MESSAGE_DIGEST
+#ifdef ENABLE_BITTORRENT
+# include "bittorrent_helper.h"
+#endif // ENABLE_BITTORRENT
 
 namespace aria2 {
 
@@ -241,7 +244,12 @@ bool DownloadCommand::executeInternal() {
         const std::string& expectedPieceHash =
           getDownloadContext()->getPieceHash(segment->getIndex());
         if(pieceHashValidationEnabled_ && !expectedPieceHash.empty()) {
-          if(segment->isHashCalculated()) {
+          if(
+#ifdef ENABLE_BITTORRENT
+             (!getPieceStorage()->isEndGame() ||
+              !getDownloadContext()->hasAttribute(bittorrent::BITTORRENT)) &&
+#endif // ENABLE_BITTORRENT
+             segment->isHashCalculated()) {
             if(getLogger()->debug()) {
               getLogger()->debug
                 ("Hash is available! index=%lu",