From 2eb7c6ec8a34c23466e40946d0e9ea1574b0006a Mon Sep 17 00:00:00 2001 From: Mikio Hara Date: Thu, 15 Aug 2013 05:08:08 +0900 Subject: [PATCH] net: simplify non-cgo DNS exchange Also does less buffer allocation in case of TCP fallback. R=golang-dev, bradfitz CC=golang-dev https://golang.org/cl/12925043 --- src/pkg/net/dnsclient_unix.go | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/pkg/net/dnsclient_unix.go b/src/pkg/net/dnsclient_unix.go index 38fbf322cf2..8548f503547 100644 --- a/src/pkg/net/dnsclient_unix.go +++ b/src/pkg/net/dnsclient_unix.go @@ -26,13 +26,7 @@ import ( // Send a request on the connection and hope for a reply. // Up to cfg.attempts attempts. func exchange(cfg *dnsConfig, c Conn, name string, qtype uint16) (*dnsMsg, error) { - var useTCP bool - switch c.(type) { - case *UDPConn: - useTCP = false - case *TCPConn: - useTCP = true - } + _, useTCP := c.(*TCPConn) if len(name) >= 256 { return nil, &DNSError{Err: "name too long", Name: name} } @@ -69,8 +63,11 @@ func exchange(cfg *dnsConfig, c Conn, name string, qtype uint16) (*dnsMsg, error continue } } - buf = make([]byte, uint16(buf[0])<<8+uint16(buf[1])) - n, err = io.ReadFull(c, buf) + mlen := int(buf[0])<<8 | int(buf[1]) + if mlen > len(buf) { + buf = make([]byte, mlen) + } + n, err = io.ReadFull(c, buf[:mlen]) } else { n, err = c.Read(buf) } @@ -80,7 +77,7 @@ func exchange(cfg *dnsConfig, c Conn, name string, qtype uint16) (*dnsMsg, error } return nil, err } - buf = buf[0:n] + buf = buf[:n] in := new(dnsMsg) if !in.Unpack(buf) || in.id != out.id { continue