]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Fix crash when announcing unloaded torrent to websocket
authorMatt Joiner <anacrolix@gmail.com>
Sat, 2 May 2020 08:36:32 +0000 (18:36 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Sun, 3 May 2020 04:10:46 +0000 (14:10 +1000)
client.go
webtorrent/tracker_client.go
wstracker.go

index 5ca405a58e7c01fc67fe62408d90ed55c50dc2d1..735d58cad063f8e8c75332d87cd9d030af34742a 100644 (file)
--- a/client.go
+++ b/client.go
@@ -247,10 +247,14 @@ func NewClient(cfg *ClientConfig) (cl *Client, err error) {
        cl.websocketTrackers = websocketTrackers{
                PeerId: cl.peerID,
                Logger: cl.logger,
-               GetAnnounceRequest: func(event tracker.AnnounceEvent, infoHash [20]byte) tracker.AnnounceRequest {
+               GetAnnounceRequest: func(event tracker.AnnounceEvent, infoHash [20]byte) (tracker.AnnounceRequest, error) {
                        cl.lock()
                        defer cl.unlock()
-                       return cl.torrents[infoHash].announceRequest(event)
+                       t, ok := cl.torrents[infoHash]
+                       if !ok {
+                               return tracker.AnnounceRequest{}, errors.New("torrent not tracked by client")
+                       }
+                       return t.announceRequest(event), nil
                },
                OnConn: func(dc datachannel.ReadWriteCloser, dcc webtorrent.DataChannelContext) {
                        cl.lock()
index c2052b99510305938e095264279c654e793c49b2..5e56ca23c5ab18a871d5d54c498f6e96bd4e6dca 100644 (file)
@@ -24,7 +24,7 @@ type TrackerClientStats struct {
 // Client represents the webtorrent client
 type TrackerClient struct {
        Url                string
-       GetAnnounceRequest func(_ tracker.AnnounceEvent, infoHash [20]byte) tracker.AnnounceRequest
+       GetAnnounceRequest func(_ tracker.AnnounceEvent, infoHash [20]byte) (tracker.AnnounceRequest, error)
        PeerId             [20]byte
        OnConn             onDataChannelOpen
        Logger             log.Logger
@@ -135,7 +135,10 @@ func (tc *TrackerClient) Announce(event tracker.AnnounceEvent, infoHash [20]byte
                return fmt.Errorf("creating offer: %w", err)
        }
 
-       request := tc.GetAnnounceRequest(event, infoHash)
+       request, err := tc.GetAnnounceRequest(event, infoHash)
+       if err != nil {
+               return fmt.Errorf("getting announce parameters: %w", err)
+       }
 
        req := AnnounceRequest{
                Numwant:    1, // If higher we need to create equal amount of offers.
index 8c71e514d067af12ca8a8e7a826e7d635316f045..4e83ca5fe790c793d8497e271997f83282ca6ade 100644 (file)
@@ -33,7 +33,7 @@ type refCountedWebtorrentTrackerClient struct {
 type websocketTrackers struct {
        PeerId             [20]byte
        Logger             log.Logger
-       GetAnnounceRequest func(event tracker.AnnounceEvent, infoHash [20]byte) tracker.AnnounceRequest
+       GetAnnounceRequest func(event tracker.AnnounceEvent, infoHash [20]byte) (tracker.AnnounceRequest, error)
        OnConn             func(datachannel.ReadWriteCloser, webtorrent.DataChannelContext)
        mu                 sync.Mutex
        clients            map[string]*refCountedWebtorrentTrackerClient