commit 7cbdfa4c1514b9667101b9e7fb6c7682de157ff3 Author: David Fifield david@bamsoftware.com Date: Sat Dec 7 21:26:15 2013 -0800
Convert IP to IPv4 before writing it in SOCKS response.
This was a bug; if the IP was a 16-byte slice, then we would read the first four bytes, which were zero. Document that address families other than IPv4 fill the four address bytes with zero, so that we sort of work with IPv6. --- socks.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/socks.go b/socks.go index a5889fa..8534636 100644 --- a/socks.go +++ b/socks.go @@ -161,17 +161,22 @@ func readSocks4aConnect(s io.Reader) (req SocksRequest, err error) { return }
-// Send a SOCKS4a response with the given code and address. +// Send a SOCKS4a response with the given code and address. If the IP field +// inside addr is not an IPv4 address, the IP portion of the response will be +// four zero bytes. func sendSocks4aResponse(w io.Writer, code byte, addr *net.TCPAddr) error { var resp [8]byte resp[0] = socksResponseVersion resp[1] = code resp[2] = byte((addr.Port >> 8) & 0xff) resp[3] = byte((addr.Port >> 0) & 0xff) - resp[4] = addr.IP[0] - resp[5] = addr.IP[1] - resp[6] = addr.IP[2] - resp[7] = addr.IP[3] + ipv4 := addr.IP.To4() + if ipv4 != nil { + resp[4] = ipv4[0] + resp[5] = ipv4[1] + resp[6] = ipv4[2] + resp[7] = ipv4[3] + } _, err := w.Write(resp[:]) return err }
tor-commits@lists.torproject.org