From: YenForYang <YenForYang@users.noreply.github.com>
Date: Tue, 14 Sep 2021 12:36:19 +0000 (-0500)
Subject: Clarify maximum value of "metadata_size" (#609)
X-Git-Tag: v1.32.0~60
X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=e80b989f8e48b487fd88fe3a055d4feeee25da37;p=btrtrc.git

Clarify maximum value of "metadata_size" (#609)
---

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()