From 5d8324e6822e34c900e36d67adf640cee6693d25 Mon Sep 17 00:00:00 2001 From: Paul Marks Date: Mon, 24 Oct 2016 17:49:22 -0700 Subject: [PATCH] net: add hostname warnings to all first(isIPv4) functions. In general, these functions cannot behave correctly when given a hostname, because a hostname may represent multiple IP addresses, and first(isIPv4) chooses at most one. Updates #9334 Change-Id: Icfb629f84af4d976476385a3071270253c0000b1 Reviewed-on: https://go-review.googlesource.com/31931 Reviewed-by: Brad Fitzpatrick --- src/net/dial.go | 6 ++++++ src/net/iprawsock.go | 3 +++ src/net/tcpsock.go | 3 +++ src/net/udpsock.go | 3 +++ 4 files changed, 15 insertions(+) diff --git a/src/net/dial.go b/src/net/dial.go index dc982bdb87..c77f0db030 100644 --- a/src/net/dial.go +++ b/src/net/dial.go @@ -533,6 +533,9 @@ func dialSingle(ctx context.Context, dp *dialParam, ra Addr) (c Conn, err error) // If host is omitted, as in ":8080", Listen listens on all available interfaces // instead of just the interface with the given host address. // See Dial for more details about address syntax. +// +// Listening on a hostname is not recommended because this creates a socket +// for at most one of its IP addresses. func Listen(net, laddr string) (Listener, error) { addrs, err := DefaultResolver.resolveAddrList(context.Background(), "listen", net, laddr, nil) if err != nil { @@ -560,6 +563,9 @@ func Listen(net, laddr string) (Listener, error) { // If host is omitted, as in ":8080", ListenPacket listens on all available interfaces // instead of just the interface with the given host address. // See Dial for the syntax of laddr. +// +// Listening on a hostname is not recommended because this creates a socket +// for at most one of its IP addresses. func ListenPacket(net, laddr string) (PacketConn, error) { addrs, err := DefaultResolver.resolveAddrList(context.Background(), "listen", net, laddr, nil) if err != nil { diff --git a/src/net/iprawsock.go b/src/net/iprawsock.go index a7a4531fde..b3cc03e00d 100644 --- a/src/net/iprawsock.go +++ b/src/net/iprawsock.go @@ -52,6 +52,9 @@ func (a *IPAddr) opAddr() Addr { // ResolveIPAddr parses addr as an IP address of the form "host" or // "ipv6-host%zone" and resolves the domain name on the network net, // which must be "ip", "ip4" or "ip6". +// +// Resolving a hostname is not recommended because this returns at most +// one of its IP addresses. func ResolveIPAddr(net, addr string) (*IPAddr, error) { if net == "" { // a hint wildcard for Go 1.0 undocumented behavior net = "ip" diff --git a/src/net/tcpsock.go b/src/net/tcpsock.go index 1f7f59a3b6..69731ebc91 100644 --- a/src/net/tcpsock.go +++ b/src/net/tcpsock.go @@ -56,6 +56,9 @@ func (a *TCPAddr) opAddr() Addr { // "tcp6". A literal address or host name for IPv6 must be enclosed // in square brackets, as in "[::1]:80", "[ipv6-host]:http" or // "[ipv6-host%zone]:80". +// +// Resolving a hostname is not recommended because this returns at most +// one of its IP addresses. func ResolveTCPAddr(net, addr string) (*TCPAddr, error) { switch net { case "tcp", "tcp4", "tcp6": diff --git a/src/net/udpsock.go b/src/net/udpsock.go index e54eee837a..246d644336 100644 --- a/src/net/udpsock.go +++ b/src/net/udpsock.go @@ -59,6 +59,9 @@ func (a *UDPAddr) opAddr() Addr { // "udp6". A literal address or host name for IPv6 must be enclosed // in square brackets, as in "[::1]:80", "[ipv6-host]:http" or // "[ipv6-host%zone]:80". +// +// Resolving a hostname is not recommended because this returns at most +// one of its IP addresses. func ResolveUDPAddr(net, addr string) (*UDPAddr, error) { switch net { case "udp", "udp4", "udp6": -- 2.48.1