Procházet zdrojové kódy

2007-10-12 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

	Fixed the bug that causes exception when reading beyond end of 
file.
	* src/IteratableChunkChecksumValidator.cc (validateChunk)
Tatsuhiro Tsujikawa před 18 roky
rodič
revize
fe1c26106b
2 změnil soubory, kde provedl 22 přidání a 2 odebrání
  1. 5 0
      ChangeLog
  2. 17 2
      src/IteratableChunkChecksumValidator.cc

+ 5 - 0
ChangeLog

@@ -1,3 +1,8 @@
+2007-10-12  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
+
+	Fixed the bug that causes exception when reading beyond end of file.
+	* src/IteratableChunkChecksumValidator.cc (validateChunk)
+
 2007-10-10  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
 
 	Fixed the bug:

+ 17 - 2
src/IteratableChunkChecksumValidator.cc

@@ -36,13 +36,28 @@
 #include "Util.h"
 #include "message.h"
 #include "MessageDigestHelper.h"
+#include "DlAbortEx.h"
 
 void IteratableChunkChecksumValidator::validateChunk()
 {
   if(!finished()) {
-    string actualChecksum = calculateActualChecksum();
-
+    string actualChecksum;
+    try {
+      actualChecksum = calculateActualChecksum();
+    } catch(DlAbortEx* ex) {
+      logger->debug("Caught exception while validating piece index=%d. Some part of file may be missing. Continue operation.", ex, _currentIndex);
+      delete ex;
 
+      int64_t offset = ((int64_t)_currentIndex)*_chunkChecksum->getChecksumLength();
+      int32_t startIndex;
+      int32_t endIndex;
+      Util::indexRange(startIndex, endIndex, offset,
+		       _chunkChecksum->getChecksumLength(),
+		       _bitfield->getBlockLength());
+      _bitfield->unsetBitRange(startIndex, endIndex);
+      _currentIndex++;
+      return;
+    }
     if(!_chunkChecksum->validateChunk(actualChecksum, _currentIndex)) {
       int64_t offset = ((int64_t)_currentIndex)*_chunkChecksum->getChecksumLength();
       // wrong checksum