diff --git a/misc.go b/misc.go index c567f68d..3cf1b8ee 100644 --- a/misc.go +++ b/misc.go @@ -6,6 +6,7 @@ import ( "fmt" "time" + "github.com/anacrolix/torrent/metainfo" pp "github.com/anacrolix/torrent/peer_protocol" ) @@ -107,3 +108,13 @@ func torrentRequestOffset(torrentLength, pieceSize int64, r request) (off int64) } return } + +func validateInfo(info *metainfo.Info) error { + if len(info.Pieces)%20 != 0 { + return errors.New("pieces has invalid length") + } + if int((info.TotalLength()+info.PieceLength-1)/info.PieceLength) != info.NumPieces() { + return errors.New("piece count and file lengths are at odds") + } + return nil +} diff --git a/torrent.go b/torrent.go index ef82e992..e32175e9 100644 --- a/torrent.go +++ b/torrent.go @@ -208,6 +208,11 @@ func infoPieceHashes(info *metainfo.Info) (ret []string) { // Called when metadata for a torrent becomes available. func (t *torrent) setMetadata(md *metainfo.Info, infoBytes []byte, eventLocker sync.Locker) (err error) { + err = validateInfo(md) + if err != nil { + err = fmt.Errorf("bad info: %s", err) + return + } t.Info = md t.length = 0 for _, f := range t.Info.UpvertedFiles() {