]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Fix deadlocking panic when checking for v2 upgrade when receiving handshake
authorMatt Joiner <anacrolix@gmail.com>
Fri, 22 Mar 2024 04:22:30 +0000 (15:22 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Fri, 22 Mar 2024 04:28:41 +0000 (15:28 +1100)
client.go

index 90a74d9570a7183fa0fcc3f9dba3a9931261dfce..5e635f27c6a8ecb9267444a8c601bdb436c1e6f6 100644 (file)
--- a/client.go
+++ b/client.go
@@ -603,13 +603,12 @@ func (cl *Client) incomingConnection(nc net.Conn) {
                        network:         nc.RemoteAddr().Network(),
                        connString:      regularNetConnPeerConnConnString(nc),
                })
-       defer func() {
-               cl.lock()
-               defer cl.unlock()
-               c.close()
-       }()
        c.Discovery = PeerSourceIncoming
        cl.runReceivedConn(c)
+
+       cl.lock()
+       c.close()
+       cl.unlock()
 }
 
 // Returns a handle to the given torrent, if it's present in the client.
@@ -1014,13 +1013,15 @@ func (cl *Client) receiveHandshakes(c *PeerConn) (t *Torrent, err error) {
        if err != nil {
                return nil, fmt.Errorf("during bt handshake: %w", err)
        }
+
        cl.lock()
        t = cl.torrentsByShortHash[ih]
-       if t.infoHashV2.Ok && *t.infoHashV2.Value.ToShort() == ih {
+       if t != nil && t.infoHashV2.Ok && *t.infoHashV2.Value.ToShort() == ih {
                torrent.Add("v2 handshakes received", 1)
                c.v2 = true
        }
        cl.unlock()
+
        return
 }