]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Return an error from Torrent.setMetadataSize
authorMatt Joiner <anacrolix@gmail.com>
Mon, 16 May 2016 08:48:56 +0000 (18:48 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Mon, 16 May 2016 08:48:56 +0000 (18:48 +1000)
This should mean connections sending ridiculous metadata sizes get dropped.

client.go
torrent.go

index 4b0d0ac43627e71b576ebe6f229b9cc1ed066a58..e5daf8b5fae6afc0ac1dcedab410820134e07edb 100644 (file)
--- a/client.go
+++ b/client.go
@@ -1244,7 +1244,11 @@ func (cl *Client) connectionLoop(t *Torrent, c *connection) error {
                                        if !ok {
                                                log.Printf("bad metadata_size type: %T", metadata_sizeUntyped)
                                        } else {
-                                               t.setMetadataSize(metadata_size, cl)
+                                               err = t.setMetadataSize(metadata_size)
+                                               if err != nil {
+                                                       err = fmt.Errorf("error setting metadata size to %d", metadata_size)
+                                                       break
+                                               }
                                        }
                                }
                                if _, ok := c.PeerExtensionIDs["ut_metadata"]; ok {
index 2f76ab9356eb914db75f41236582460bd088662e..7d027fae1037323df14134eee4a08634316e9135 100644 (file)
@@ -275,14 +275,13 @@ func (t *Torrent) haveAllMetadataPieces() bool {
 }
 
 // TODO: Propagate errors to disconnect peer.
-func (t *Torrent) setMetadataSize(bytes int64, cl *Client) {
+func (t *Torrent) setMetadataSize(bytes int64) (err error) {
        if t.haveInfo() {
                // We already know the correct metadata size.
                return
        }
        if bytes <= 0 || bytes > 10000000 { // 10MB, pulled from my ass.
-               log.Printf("%s: received bad metadata size: %d", t, bytes)
-               return
+               return errors.New("bad size")
        }
        if t.metadataBytes != nil && len(t.metadataBytes) == int(bytes) {
                return
@@ -292,7 +291,7 @@ func (t *Torrent) setMetadataSize(bytes int64, cl *Client) {
        for _, c := range t.conns {
                c.requestPendingMetadata()
        }
-
+       return
 }
 
 // The current working name for the torrent. Either the name in the info dict,