]> Cypherpunks repositories - gostls13.git/commitdiff
net: respect go vs cgo resolver selection in all lookup routines
authorRuss Cox <rsc@golang.org>
Wed, 19 Aug 2015 02:50:12 +0000 (22:50 -0400)
committerRuss Cox <rsc@golang.org>
Wed, 19 Aug 2015 04:20:37 +0000 (04:20 +0000)
This is especially important for LookupAddr, which used to be pure Go
(lightweight, one goroutine per call) and without this CL is now
unconditionally cgo (heavy, one thread per call).

Fixes #12190.

Change-Id: I43436a942bc1838b024225893e156f280a1e80cf
Reviewed-on: https://go-review.googlesource.com/13698
Reviewed-by: Rob Pike <r@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/net/conf.go
src/net/lookup_unix.go

index 01bb585ce673b5c02527e67f080f41b5236ec82d..c92e579d7e6852e4e929a2c1dc8a1e7dfe69789d 100644 (file)
@@ -19,7 +19,7 @@ type conf struct {
        // forceCgoLookupHost forces CGO to always be used, if available.
        forceCgoLookupHost bool
 
-       netGo  bool // "netgo" build tag in use (or no cgo)
+       netGo  bool // go DNS resolution forced
        netCgo bool // cgo DNS resolution forced
 
        // machine has an /etc/mdns.allow file
@@ -112,6 +112,12 @@ func initConfVal() {
        }
 }
 
+// canUseCgo reports whether calling cgo functions is allowed
+// for non-hostname lookups.
+func (c *conf) canUseCgo() bool {
+       return c.hostLookupOrder("") == hostLookupCgo
+}
+
 // hostLookupOrder determines which strategy to use to resolve hostname.
 func (c *conf) hostLookupOrder(hostname string) (ret hostLookupOrder) {
        if c.dnsDebugLevel > 1 {
index 1c811d268330a1d0d4911ee1bed9c2d9446fb4fb..a64da8bcb5053c93c27a8cca3d89d2a518e4196a 100644 (file)
@@ -74,19 +74,21 @@ func lookupIP(host string) (addrs []IPAddr, err error) {
 }
 
 func lookupPort(network, service string) (int, error) {
-       port, err, ok := cgoLookupPort(network, service)
-       if !ok {
-               port, err = goLookupPort(network, service)
+       if systemConf().canUseCgo() {
+               if port, err, ok := cgoLookupPort(network, service); ok {
+                       return port, err
+               }
        }
-       return port, err
+       return goLookupPort(network, service)
 }
 
 func lookupCNAME(name string) (string, error) {
-       cname, err, ok := cgoLookupCNAME(name)
-       if !ok {
-               cname, err = goLookupCNAME(name)
+       if systemConf().canUseCgo() {
+               if cname, err, ok := cgoLookupCNAME(name); ok {
+                       return cname, err
+               }
        }
-       return cname, err
+       return goLookupCNAME(name)
 }
 
 func lookupSRV(service, proto, name string) (string, []*SRV, error) {
@@ -148,9 +150,10 @@ func lookupTXT(name string) ([]string, error) {
 }
 
 func lookupAddr(addr string) ([]string, error) {
-       ptrs, err, ok := cgoLookupPTR(addr)
-       if !ok {
-               ptrs, err = goLookupPTR(addr)
+       if systemConf().canUseCgo() {
+               if ptrs, err, ok := cgoLookupPTR(addr); ok {
+                       return ptrs, err
+               }
        }
-       return ptrs, err
+       return goLookupPTR(addr)
 }