From: Matt Joiner Date: Sun, 3 Apr 2016 06:33:31 +0000 (+1000) Subject: storage: Don't read bad completed piece files X-Git-Tag: v1.0.0~803 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=f19e8b32aa236147f47254af3db1c6005af8bf65;p=btrtrc.git storage: Don't read bad completed piece files --- diff --git a/storage/piece_file.go b/storage/piece_file.go index c9fc3c21..95b2af0b 100644 --- a/storage/piece_file.go +++ b/storage/piece_file.go @@ -59,22 +59,37 @@ func (me pieceFileTorrentStoragePiece) MarkComplete() error { return me.fs.Rename(me.incompletePath(), me.completedPath()) } -func (me pieceFileTorrentStoragePiece) ReadAt(b []byte, off int64) (n int, err error) { - f, err := me.fs.OpenFile(me.completedPath(), os.O_RDONLY) - if err != nil { - f, err = me.fs.OpenFile(me.incompletePath(), os.O_RDONLY) - if os.IsNotExist(err) { - err = io.ErrUnexpectedEOF - return - } - if err != nil { +func (me pieceFileTorrentStoragePiece) openFile() (f missinggo.File, err error) { + f, err = me.fs.OpenFile(me.completedPath(), os.O_RDONLY) + if err == nil { + var fi os.FileInfo + fi, err = f.Stat() + if err == nil && fi.Size() == me.p.Length() { return } + f.Close() + } else if !os.IsNotExist(err) { + return + } + f, err = me.fs.OpenFile(me.incompletePath(), os.O_RDONLY) + if os.IsNotExist(err) { + err = io.ErrUnexpectedEOF + } + return +} + +func (me pieceFileTorrentStoragePiece) ReadAt(b []byte, off int64) (n int, err error) { + f, err := me.openFile() + if err != nil { + return } defer f.Close() + missinggo.LimitLen(&b, me.p.Length()-off) n, err = f.ReadAt(b, off) off += int64(n) - if err == io.EOF && off < me.p.Length() { + if off >= me.p.Length() { + err = io.EOF + } else if err == io.EOF { err = io.ErrUnexpectedEOF } return