]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Fix file piece index offset calculations
authorMatt Joiner <anacrolix@gmail.com>
Thu, 25 Jan 2018 06:01:29 +0000 (17:01 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Thu, 25 Jan 2018 06:01:29 +0000 (17:01 +1100)
file.go
torrent.go

diff --git a/file.go b/file.go
index 7cc0ad64bf5d67f520ba37863f8c7d368fb78b13..5983b855e1d46f470b8b804aac05a1dea333c423 100644 (file)
--- a/file.go
+++ b/file.go
@@ -121,7 +121,7 @@ func (f *File) SetPriority(prio piecePriority) {
                return
        }
        f.prio = prio
-       f.t.updatePiecePriorities(f.firstPieceIndex().Int(), f.lastPieceIndex().Int()+1)
+       f.t.updatePiecePriorities(f.firstPieceIndex().Int(), f.endPieceIndex().Int())
 }
 
 // Returns the priority per File.SetPriority.
@@ -132,9 +132,15 @@ func (f *File) Priority() piecePriority {
 }
 
 func (f *File) firstPieceIndex() pwp.Integer {
+       if f.t.usualPieceSize() == 0 {
+               return 0
+       }
        return pwp.Integer(f.offset / int64(f.t.usualPieceSize()))
 }
 
-func (f *File) lastPieceIndex() pwp.Integer {
-       return pwp.Integer((f.offset + f.length) / int64(f.t.usualPieceSize()))
+func (f *File) endPieceIndex() pwp.Integer {
+       if f.t.usualPieceSize() == 0 {
+               return 0
+       }
+       return pwp.Integer((f.offset+f.length-1)/int64(f.t.usualPieceSize())) + 1
 }
index 981f5b85a83776e7eeb9bd8fb55fed93b27985e1..6440a3f823636e4925d6465ad82c6be5a56985f7 100644 (file)
@@ -305,26 +305,33 @@ func (t *Torrent) makePieces() {
                piece.index = i
                piece.noPendingWrites.L = &piece.pendingWritesMutex
                missinggo.CopyExact(piece.hash[:], hash)
-               piece.files = (*t.files)[pieceFirstFileIndex(piece.torrentBeginOffset(), *t.files):pieceLastFileIndex(piece.torrentEndOffset(), *t.files)]
+               files := *t.files
+               beginFile := pieceFirstFileIndex(piece.torrentBeginOffset(), files)
+               endFile := pieceEndFileIndex(piece.torrentEndOffset(), files)
+               piece.files = files[beginFile:endFile]
        }
 }
 
+// Returns the index of the first file containing the piece. files must be
+// ordered by offset.
 func pieceFirstFileIndex(pieceOffset int64, files []*File) int {
        for i, f := range files {
                if f.offset+f.length > pieceOffset {
                        return i
                }
        }
-       return -1
+       return 0
 }
 
-func pieceLastFileIndex(pieceEndOffset int64, files []*File) int {
+// Returns the index after the last file containing the piece. files must be
+// ordered by offset.
+func pieceEndFileIndex(pieceEndOffset int64, files []*File) int {
        for i, f := range files {
                if f.offset+f.length >= pieceEndOffset {
-                       return i
+                       return i + 1
                }
        }
-       return -1
+       return 0
 }
 
 func (t *Torrent) cacheLength(info *metainfo.Info) {