From e7e56ada0732451c6f4482745103f1b85dbf0d2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ask=20Bj=C3=B8rn=20Hansen?= Date: Fri, 10 May 2013 16:21:13 -0700 Subject: [PATCH 1/2] Don't try to close the client config file if opening fails $ q panic: runtime error: invalid memory address or nil pointer dereference [signal 0xb code=0x1 addr=0x0 pc=0x9c124] goroutine 1 [running]: os.(*File).Close(0x0, 0xf800000010, 0x0, 0xf840054e40) /usr/local/go/src/pkg/os/file_unix.go:99 +0x1c github.com/miekg/dns.ClientConfigFromFile(0x1c3294, 0x6374652f00000010, 0x0, 0xf840054e40, 0xf840054de0, ...) /Users/ask/go/src/github.com/miekg/dns/clientconfig.go:30 +0xcc main.main() /Users/ask/go/src/github.com/miekg/dns/ex/q/q.go:50 +0x45b --- clientconfig.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clientconfig.go b/clientconfig.go index f6284fed..ed77e4f0 100644 --- a/clientconfig.go +++ b/clientconfig.go @@ -25,10 +25,10 @@ type ClientConfig struct { // a *ClientConfig. func ClientConfigFromFile(conf string) (*ClientConfig, error) { file, err := os.Open(conf) - defer file.Close() if err != nil { return nil, err } + defer file.Close() c := new(ClientConfig) b := bufio.NewReader(file) c.Servers = make([]string, 0) From e4a33cd4945f1d675cb9ea8b80a284514788f3aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ask=20Bj=C3=B8rn=20Hansen?= Date: Fri, 10 May 2013 22:51:23 -0700 Subject: [PATCH 2/2] Work without resolv.conf if the nameserver is specified with @... --- ex/q/q.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/ex/q/q.go b/ex/q/q.go index fcc1cf80..ba12a5e7 100644 --- a/ex/q/q.go +++ b/ex/q/q.go @@ -47,8 +47,6 @@ func main() { flag.PrintDefaults() } - conf, _ := dns.ClientConfigFromFile("/etc/resolv.conf") - nameserver := "@" + conf.Servers[0] qtype := uint16(0) qclass := uint16(dns.ClassINET) var qname []string @@ -70,6 +68,8 @@ func main() { } } + var nameserver string + Flags: for i := 0; i < flag.NArg(); i++ { // If it starts with @ it is a nameserver @@ -109,6 +109,15 @@ Flags: qtype = dns.TypeA } + if len(nameserver) == 0 { + conf, err := dns.ClientConfigFromFile("/etc/resolv.conf") + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(2) + } + nameserver = "@" + conf.Servers[0] + } + nameserver = string([]byte(nameserver)[1:]) // chop off @ // if the nameserver is from /etc/resolv.conf the [ and ] are already // added, thereby breaking net.ParseIP. Check for this and don't