]> Sergey Matveev's repositories - btrtrc.git/commitdiff
The "m" field in the extended handshake is not mandatory
authorMatt Joiner <anacrolix@gmail.com>
Wed, 8 Nov 2017 08:29:55 +0000 (19:29 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Wed, 8 Nov 2017 08:29:55 +0000 (19:29 +1100)
connection.go

index 6b83868ee4b92bfd24c97778c0962eca6fae8636..c52328a0e6a68ef98b8f16d1aca9c8c26e5d4355 100644 (file)
@@ -892,32 +892,29 @@ func (c *connection) mainReadLoop() error {
                                if v, ok := d["v"]; ok {
                                        c.PeerClientName = v.(string)
                                }
-                               m, ok := d["m"]
-                               if !ok {
-                                       err = errors.New("handshake missing m item")
-                                       break
-                               }
-                               mTyped, ok := m.(map[string]interface{})
-                               if !ok {
-                                       err = errors.New("handshake m value is not dict")
-                                       break
-                               }
-                               if c.PeerExtensionIDs == nil {
-                                       c.PeerExtensionIDs = make(map[string]byte, len(mTyped))
-                               }
-                               for name, v := range mTyped {
-                                       id, ok := v.(int64)
+                               if m, ok := d["m"]; ok {
+                                       mTyped, ok := m.(map[string]interface{})
                                        if !ok {
-                                               log.Printf("bad handshake m item extension ID type: %T", v)
-                                               continue
+                                               err = errors.New("handshake m value is not dict")
+                                               break
                                        }
-                                       if id == 0 {
-                                               delete(c.PeerExtensionIDs, name)
-                                       } else {
-                                               if c.PeerExtensionIDs[name] == 0 {
-                                                       supportedExtensionMessages.Add(name, 1)
+                                       if c.PeerExtensionIDs == nil {
+                                               c.PeerExtensionIDs = make(map[string]byte, len(mTyped))
+                                       }
+                                       for name, v := range mTyped {
+                                               id, ok := v.(int64)
+                                               if !ok {
+                                                       log.Printf("bad handshake m item extension ID type: %T", v)
+                                                       continue
+                                               }
+                                               if id == 0 {
+                                                       delete(c.PeerExtensionIDs, name)
+                                               } else {
+                                                       if c.PeerExtensionIDs[name] == 0 {
+                                                               supportedExtensionMessages.Add(name, 1)
+                                                       }
+                                                       c.PeerExtensionIDs[name] = byte(id)
                                                }
-                                               c.PeerExtensionIDs[name] = byte(id)
                                        }
                                }
                                metadata_sizeUntyped, ok := d["metadata_size"]