diff options
author | Andrew Pilloud <andrewpilloud@igneoussystems.com> | 2015-02-12 20:24:47 -0800 |
---|---|---|
committer | Mikio Hara <mikioh.mikioh@gmail.com> | 2015-03-08 09:58:11 +0000 |
commit | f00362b9ecf9fbca6f099493a4e8d1c6a030dee3 (patch) | |
tree | 034ac1024dc1e7d73ed2cb52d483e1f532b14859 /src/net/lookup.go | |
parent | cbc854a7993accd581c3ad2a58cb51788372e29c (diff) | |
download | go-f00362b9ecf9fbca6f099493a4e8d1c6a030dee3.tar.gz go-f00362b9ecf9fbca6f099493a4e8d1c6a030dee3.zip |
net: LookupHost and Resolve{TCP,UDP,IP}Addr should use zone from getaddrinfo
The unix and windows getaddrinfo calls return a zone with IPv6
addresses. IPv6 link-local addresses returned are only valid on the
given zone. When the zone is dropped, connections to the address
will fail. This patch replaces IP with IPAddr in several internal
resolver functions, and plumbs through the zone.
Change-Id: Ifea891654f586f15b76988464f82e04a42ccff6d
Reviewed-on: https://go-review.googlesource.com/5851
Reviewed-by: Mikio Hara <mikioh.mikioh@gmail.com>
Diffstat (limited to 'src/net/lookup.go')
-rw-r--r-- | src/net/lookup.go | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/src/net/lookup.go b/src/net/lookup.go index aeffe6c9b7..65abc81309 100644 --- a/src/net/lookup.go +++ b/src/net/lookup.go @@ -27,8 +27,16 @@ func LookupHost(host string) (addrs []string, err error) { // LookupIP looks up host using the local resolver. // It returns an array of that host's IPv4 and IPv6 addresses. -func LookupIP(host string) (addrs []IP, err error) { - return lookupIPMerge(host) +func LookupIP(host string) (ips []IP, err error) { + addrs, err := lookupIPMerge(host) + if err != nil { + return + } + ips = make([]IP, len(addrs)) + for i, addr := range addrs { + ips[i] = addr.IP + } + return } var lookupGroup singleflight @@ -36,7 +44,7 @@ var lookupGroup singleflight // lookupIPMerge wraps lookupIP, but makes sure that for any given // host, only one lookup is in-flight at a time. The returned memory // is always owned by the caller. -func lookupIPMerge(host string) (addrs []IP, err error) { +func lookupIPMerge(host string) (addrs []IPAddr, err error) { addrsi, err, shared := lookupGroup.Do(host, func() (interface{}, error) { return lookupIP(host) }) @@ -45,13 +53,13 @@ func lookupIPMerge(host string) (addrs []IP, err error) { // lookupIPReturn turns the return values from singleflight.Do into // the return values from LookupIP. -func lookupIPReturn(addrsi interface{}, err error, shared bool) ([]IP, error) { +func lookupIPReturn(addrsi interface{}, err error, shared bool) ([]IPAddr, error) { if err != nil { return nil, err } - addrs := addrsi.([]IP) + addrs := addrsi.([]IPAddr) if shared { - clone := make([]IP, len(addrs)) + clone := make([]IPAddr, len(addrs)) copy(clone, addrs) addrs = clone } @@ -59,7 +67,7 @@ func lookupIPReturn(addrsi interface{}, err error, shared bool) ([]IP, error) { } // lookupIPDeadline looks up a hostname with a deadline. -func lookupIPDeadline(host string, deadline time.Time) (addrs []IP, err error) { +func lookupIPDeadline(host string, deadline time.Time) (addrs []IPAddr, err error) { if deadline.IsZero() { return lookupIPMerge(host) } |