diff --git a/global.go b/global.go index e06d9323..4e48d0c5 100644 --- a/global.go +++ b/global.go @@ -10,6 +10,10 @@ import ( const ( pieceHash = crypto.SHA1 defaultChunkSize = 0x4000 // 16KiB + + // Arbitrary maximum of "metadata_size" (see https://www.bittorrent.org/beps/bep_0009.html) + // This value is 2x what libtorrent-rasterbar uses, which should be plenty + maxMetadataSize uint32 = 8*1024*1024 ) // These are our extended message IDs. Peers will use these values to diff --git a/torrent.go b/torrent.go index 6f4730e2..a584874b 100644 --- a/torrent.go +++ b/torrent.go @@ -481,19 +481,19 @@ func (t *Torrent) haveAllMetadataPieces() bool { } // TODO: Propagate errors to disconnect peer. -func (t *Torrent) setMetadataSize(bytes int) (err error) { +func (t *Torrent) setMetadataSize(size int) (err error) { if t.haveInfo() { // We already know the correct metadata size. return } - if bytes <= 0 || bytes > 10000000 { // 10MB, pulled from my ass. + if uint32(size) > maxMetadataSize { return errors.New("bad size") } - if t.metadataBytes != nil && len(t.metadataBytes) == int(bytes) { + if len(t.metadataBytes) == size { return } - t.metadataBytes = make([]byte, bytes) - t.metadataCompletedChunks = make([]bool, (bytes+(1<<14)-1)/(1<<14)) + t.metadataBytes = make([]byte, size) + t.metadataCompletedChunks = make([]bool, (size+(1<<14)-1)/(1<<14)) t.metadataChanged.Broadcast() for c := range t.conns { c.requestPendingMetadata()