From 6966bce653a1a866c2a8fc3f8b5bcccf123a046d Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Thu, 2 Mar 2017 19:35:44 +0000 Subject: [PATCH] Fix resolving CNAME with no proxy (#564) This fixes a crash when we resolve (or try to) an external CNAME when no proxy is set. Add test as well. --- middleware/proxy/proxy.go | 4 +++ test/cache_test.go | 2 +- test/ds_file_test.go | 2 +- test/example_test.go | 1 + test/file_cname_proxy_test.go | 52 ++++++++++++++++++++++++++++++++++ test/file_reload_test.go | 5 ++-- test/middleware_dnssec_test.go | 2 +- test/middleware_test.go | 2 +- test/proxy_test.go | 2 +- test/reverse_test.go | 2 +- test/wildcard_test.go | 2 +- 11 files changed, 67 insertions(+), 9 deletions(-) create mode 100644 test/file_cname_proxy_test.go diff --git a/middleware/proxy/proxy.go b/middleware/proxy/proxy.go index 9457fb2a1..d21dee732 100644 --- a/middleware/proxy/proxy.go +++ b/middleware/proxy/proxy.go @@ -142,6 +142,10 @@ func (p Proxy) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) ( } func (p Proxy) match(state request.Request) (u Upstream) { + if p.Upstreams == nil { + return nil + } + longestMatch := 0 for _, upstream := range *p.Upstreams { from := upstream.From() diff --git a/test/cache_test.go b/test/cache_test.go index f3b752617..43ef29efb 100644 --- a/test/cache_test.go +++ b/test/cache_test.go @@ -18,7 +18,7 @@ func TestLookupCache(t *testing.T) { // Start auth. CoreDNS holding the auth zone. name, rm, err := test.TempFile(".", exampleOrg) if err != nil { - t.Fatalf("failed to created zone: %s", err) + t.Fatalf("failed to create zone: %s", err) } defer rm() diff --git a/test/ds_file_test.go b/test/ds_file_test.go index a41bec379..16170aad3 100644 --- a/test/ds_file_test.go +++ b/test/ds_file_test.go @@ -35,7 +35,7 @@ func TestLookupDS(t *testing.T) { t.Parallel() name, rm, err := TempFile(".", miekNL) if err != nil { - t.Fatalf("failed to created zone: %s", err) + t.Fatalf("failed to create zone: %s", err) } defer rm() diff --git a/test/example_test.go b/test/example_test.go index 5b6df9dcc..e8f30e983 100644 --- a/test/example_test.go +++ b/test/example_test.go @@ -8,4 +8,5 @@ example.org. IN A 127.0.0.1 example.org. IN A 127.0.0.2 *.w.example.org. IN TXT "Wildcard" a.b.c.w.example.org. IN TXT "Not a wildcard" +cname.example.org. IN CNAME www.example.net. ` diff --git a/test/file_cname_proxy_test.go b/test/file_cname_proxy_test.go new file mode 100644 index 000000000..61bd8764e --- /dev/null +++ b/test/file_cname_proxy_test.go @@ -0,0 +1,52 @@ +package test + +import ( + "io/ioutil" + "log" + "testing" + + "github.com/coredns/coredns/middleware/proxy" + "github.com/coredns/coredns/middleware/test" + "github.com/coredns/coredns/request" + + "github.com/miekg/dns" +) + +func TestZoneExternalCNAMELookup(t *testing.T) { + t.Parallel() + log.SetOutput(ioutil.Discard) + + name, rm, err := TempFile(".", exampleOrg) + if err != nil { + t.Fatalf("Failed to create zone: %s", err) + } + defer rm() + + // Corefile with for example without proxy section. + corefile := `example.org:0 { + file ` + name + ` +} +` + i, err := CoreDNSServer(corefile) + if err != nil { + t.Fatalf("Could not get CoreDNS serving instance: %s", err) + } + + udp, _ := CoreDNSServerPorts(i, 0) + if udp == "" { + t.Fatalf("Could not get UDP listening port") + } + defer i.Stop() + + p := proxy.NewLookup([]string{udp}) + state := request.Request{W: &test.ResponseWriter{}, Req: new(dns.Msg)} + + resp, err := p.Lookup(state, "cname.example.org.", dns.TypeA) + if err != nil { + t.Fatalf("Expected to receive reply, but didn't: %s", err) + } + // There should only be a CNAME in the answer section. + if len(resp.Answer) != 1 { + t.Fatalf("Expected 1 RR in answer section got %d", len(resp.Answer)) + } +} diff --git a/test/file_reload_test.go b/test/file_reload_test.go index 280818c33..fd21a73b8 100644 --- a/test/file_reload_test.go +++ b/test/file_reload_test.go @@ -9,6 +9,7 @@ import ( "github.com/coredns/coredns/middleware/proxy" "github.com/coredns/coredns/middleware/test" "github.com/coredns/coredns/request" + "github.com/miekg/dns" ) @@ -18,7 +19,7 @@ func TestZoneReload(t *testing.T) { name, rm, err := TempFile(".", exampleOrg) if err != nil { - t.Fatalf("Failed to created zone: %s", err) + t.Fatalf("Failed to create zone: %s", err) } defer rm() @@ -47,7 +48,7 @@ example.net:0 { resp, err := p.Lookup(state, "example.org.", dns.TypeA) if err != nil { - t.Fatal("Expected to receive reply, but didn't") + t.Fatalf("Expected to receive reply, but didn't: %s", err) } if len(resp.Answer) != 2 { t.Fatalf("Expected two RR in answer section got %d", len(resp.Answer)) diff --git a/test/middleware_dnssec_test.go b/test/middleware_dnssec_test.go index 8b264014b..819ee66d7 100644 --- a/test/middleware_dnssec_test.go +++ b/test/middleware_dnssec_test.go @@ -15,7 +15,7 @@ func TestLookupBalanceRewriteCacheDnssec(t *testing.T) { t.Parallel() name, rm, err := test.TempFile(".", exampleOrg) if err != nil { - t.Fatalf("failed to created zone: %s", err) + t.Fatalf("failed to create zone: %s", err) } defer rm() rm1 := createKeyFile(t) diff --git a/test/middleware_test.go b/test/middleware_test.go index a631bb274..ef468cdf7 100644 --- a/test/middleware_test.go +++ b/test/middleware_test.go @@ -14,7 +14,7 @@ func benchmarkLookupBalanceRewriteCache(b *testing.B) { t := new(testing.T) name, rm, err := test.TempFile(".", exampleOrg) if err != nil { - t.Fatalf("failed to created zone: %s", err) + t.Fatalf("failed to create zone: %s", err) } defer rm() diff --git a/test/proxy_test.go b/test/proxy_test.go index c550af044..7b96582c5 100644 --- a/test/proxy_test.go +++ b/test/proxy_test.go @@ -16,7 +16,7 @@ func TestLookupProxy(t *testing.T) { t.Parallel() name, rm, err := test.TempFile(".", exampleOrg) if err != nil { - t.Fatalf("failed to created zone: %s", err) + t.Fatalf("failed to create zone: %s", err) } defer rm() diff --git a/test/reverse_test.go b/test/reverse_test.go index c120555a9..6342f66b8 100644 --- a/test/reverse_test.go +++ b/test/reverse_test.go @@ -16,7 +16,7 @@ func TestReverseFallthrough(t *testing.T) { t.Parallel() name, rm, err := test.TempFile(".", exampleOrg) if err != nil { - t.Fatalf("failed to created zone: %s", err) + t.Fatalf("failed to create zone: %s", err) } defer rm() diff --git a/test/wildcard_test.go b/test/wildcard_test.go index 06b0ea5d2..a8f103ccc 100644 --- a/test/wildcard_test.go +++ b/test/wildcard_test.go @@ -16,7 +16,7 @@ func TestLookupWildcard(t *testing.T) { t.Parallel() name, rm, err := test.TempFile(".", exampleOrg) if err != nil { - t.Fatalf("failed to created zone: %s", err) + t.Fatalf("failed to create zone: %s", err) } defer rm()