From d794f92c1438b252d40822952484bffb2d1f7c9d Mon Sep 17 00:00:00 2001 From: Leo Balduf <balduf@hm.edu> Date: Thu, 18 Aug 2016 10:15:07 -0400 Subject: [PATCH] http: fix encoding of IPv4 peers with 16-byte addresses --- frontend/http/writer.go | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/frontend/http/writer.go b/frontend/http/writer.go index 7e0dead..54b3fe2 100644 --- a/frontend/http/writer.go +++ b/frontend/http/writer.go @@ -36,7 +36,7 @@ func WriteAnnounceResponse(w http.ResponseWriter, resp *bittorrent.AnnounceRespo // Add the IPv4 peers to the dictionary. for _, peer := range resp.IPv4Peers { - IPv4CompactDict = append(IPv4CompactDict, compact(peer)...) + IPv4CompactDict = append(IPv4CompactDict, compact4(peer)...) } if len(IPv4CompactDict) > 0 { bdict["peers"] = IPv4CompactDict @@ -44,7 +44,7 @@ func WriteAnnounceResponse(w http.ResponseWriter, resp *bittorrent.AnnounceRespo // Add the IPv6 peers to the dictionary. for _, peer := range resp.IPv6Peers { - IPv6CompactDict = append(IPv6CompactDict, compact(peer)...) + IPv6CompactDict = append(IPv6CompactDict, compact6(peer)...) } if len(IPv6CompactDict) > 0 { bdict["peers6"] = IPv6CompactDict @@ -82,8 +82,23 @@ func WriteScrapeResponse(w http.ResponseWriter, resp *bittorrent.ScrapeResponse) }) } -func compact(peer bittorrent.Peer) (buf []byte) { - buf = []byte(peer.IP) +func compact4(peer bittorrent.Peer) (buf []byte) { + if ip := peer.IP.To4(); ip == nil { + panic("non-IPv4 IP for Peer in IPv4Peers") + } else { + buf = []byte(ip) + } + buf = append(buf, byte(peer.Port>>8)) + buf = append(buf, byte(peer.Port&0xff)) + return +} + +func compact6(peer bittorrent.Peer) (buf []byte) { + if ip := peer.IP.To16(); ip == nil { + panic("non-IPv6 IP for Peer in IPv6Peers") + } else { + buf = []byte(ip) + } buf = append(buf, byte(peer.Port>>8)) buf = append(buf, byte(peer.Port&0xff)) return