about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRichard Nyberg <rnyberg@murmeldjur.se>2006-03-17 13:58:11 +0000
committerRichard Nyberg <rnyberg@murmeldjur.se>2006-03-17 13:58:11 +0000
commitb72b6bb8ba1bcd3030565159ee09f39fe7353379 (patch)
treeafa92b2c8d11c37c74f6784703cb96ece41f7b1e
parentcdb471d0acf5854a9b53aaec6812344d7f624d72 (diff)
downloadbtpd-b72b6bb8ba1bcd3030565159ee09f39fe7353379.tar.gz
btpd-b72b6bb8ba1bcd3030565159ee09f39fe7353379.zip
The code for testing content that has potentially been modified between btpd
runs was quite broken. Pieces stayed marked as ok event though the hash test
failed for pieces in modified files. Oops! 

-rw-r--r--btpd/content.c25
1 files changed, 12 insertions, 13 deletions
diff --git a/btpd/content.c b/btpd/content.c
index d5177b1..d86d596 100644
--- a/btpd/content.c
+++ b/btpd/content.c
@@ -562,6 +562,10 @@ test_torrent(struct torrent *tp, volatile sig_atomic_t *cancel)
             break;
         if (test_hash(tp, hash, piece) == 0)
             set_bit(tp->cm->piece_field, piece);
+        else {
+            clear_bit(tp->cm->piece_field, piece);
+            bzero(cm->block_field + piece * cm->bppbf, cm->bppbf);
+        }
         if (*cancel) {
             err = EINTR;
             break;
@@ -684,25 +688,20 @@ cm_td_start(struct cm_op *op)
         memset(cm->pos_field, 0xff, ceil(tp->meta.npieces / 8.0));
         off_t off = 0;
         for (int i = 0; i < tp->meta.nfiles; i++) {
-            if (sbs[i].size == -1 || sbs[i].size == 0) {
-                uint32_t start = off / tp->meta.piece_length;
-                uint32_t end = (off + tp->meta.files[i].length - 1) /
-                    tp->meta.piece_length;
+            if (sbs[i].size != tp->meta.files[i].length) {
+                uint32_t start, end;
+                end = (off + tp->meta.files[i].length - 1)
+                    / tp->meta.piece_length;
+                if (sbs[i].size == -1)
+                    start = off / tp->meta.piece_length;
+                else
+                    start = (off + sbs[i].size) / tp->meta.piece_length;
                 while (start <= end) {
                     clear_bit(cm->pos_field, start);
                     clear_bit(cm->piece_field, start);
                     bzero(cm->block_field + start * cm->bppbf, cm->bppbf);
                     start++;
                 }
-            } else if (sbs[i].size < tp->meta.files[i].length) {
-                uint32_t start = (off + sbs[i].size) /
-                    tp->meta.piece_length;
-                uint32_t end = (off + tp->meta.files[i].length - 1) /
-                    tp->meta.piece_length;
-                while (start <= end) {
-                    clear_bit(cm->pos_field, start);
-                    start++;
-                }
             }
             off += tp->meta.files[i].length;
         }