]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Invalidating metadata would cause a crash when metadata pieces kept arriving
authorMatt Joiner <anacrolix@gmail.com>
Mon, 14 Jul 2014 13:12:52 +0000 (23:12 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Mon, 14 Jul 2014 13:12:52 +0000 (23:12 +1000)
client.go
torrent.go

index 47bc5b6dc135b32d9eb4428da3b6e300ce63ff7c..956c448e68841ef65504d40e1a0c0d02a3fd1432 100644 (file)
--- a/client.go
+++ b/client.go
@@ -494,6 +494,8 @@ func (cl *Client) completedMetadata(t *torrent) {
                t.InvalidateMetadata()
                return
        }
+       // TODO(anacrolix): If this fails, I think something harsher should be
+       // done.
        err = cl.setMetaData(t, info, t.MetaData)
        if err != nil {
                log.Printf("error setting metadata: %s", err)
index e6844f1c03d468a1fa4b42c8149d982bb27241d6..e9361c868dbdad18996f645d0c024e6112ca21cf 100644 (file)
@@ -53,9 +53,8 @@ type torrent struct {
 }
 
 func (t *torrent) InvalidateMetadata() {
-       for i := range t.metadataHave {
-               t.metadataHave[i] = false
-       }
+       t.MetaData = nil
+       t.metadataHave = nil
        t.Info = nil
 }
 
@@ -63,6 +62,10 @@ func (t *torrent) SaveMetadataPiece(index int, data []byte) {
        if t.haveInfo() {
                return
        }
+       if index >= len(t.metadataHave) {
+               log.Printf("%s: ignoring metadata piece %d", t, index)
+               return
+       }
        copy(t.MetaData[(1<<14)*index:], data)
        t.metadataHave[index] = true
 }