From cfbfa5c00e6be3f1dceabe33078499e332de58ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl-Magnus=20Bj=C3=B6rkell?= Date: Wed, 31 Oct 2018 22:08:58 +0100 Subject: [PATCH] plugin/etcd: propagate recursion flag properly (#2254) When fetching records via the etcd plugin, the recursion flag was never set properly according to if the caller requested an exact record match or not. This cause problems especially in CNAME lookups, where recursion took place and a random RR was returned instead of the one that was specifically added for this key. Even when there is no service attached on the given path, it is still wrong to return a random one from the recursion. Fixing by using the `exact` flag to decide if recursion should be done. --- plugin/etcd/cname_test.go | 7 +++++++ plugin/etcd/etcd.go | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/plugin/etcd/cname_test.go b/plugin/etcd/cname_test.go index bf27573cc..48766c793 100644 --- a/plugin/etcd/cname_test.go +++ b/plugin/etcd/cname_test.go @@ -57,6 +57,7 @@ var servicesCname = []*msg.Service{ {Host: "cname5.region2.skydns.test", Key: "cname4.region2.skydns.test."}, {Host: "cname6.region2.skydns.test", Key: "cname5.region2.skydns.test."}, {Host: "endpoint.region2.skydns.test", Key: "cname6.region2.skydns.test."}, + {Host: "mainendpoint.region2.skydns.test", Key: "region2.skydns.test."}, {Host: "10.240.0.1", Key: "endpoint.region2.skydns.test."}, } @@ -76,4 +77,10 @@ var dnsTestCasesCname = []test.Case{ test.A("endpoint.region2.skydns.test. 300 IN A 10.240.0.1"), }, }, + { + Qname: "region2.skydns.test.", Qtype: dns.TypeCNAME, + Answer: []dns.RR{ + test.CNAME("region2.skydns.test. 300 IN CNAME mainendpoint.region2.skydns.test."), + }, + }, } diff --git a/plugin/etcd/etcd.go b/plugin/etcd/etcd.go index 493764f0b..5d258507c 100644 --- a/plugin/etcd/etcd.go +++ b/plugin/etcd/etcd.go @@ -75,7 +75,7 @@ func (e *Etcd) Records(state request.Request, exact bool) ([]msg.Service, error) name := state.Name() path, star := msg.PathWithWildcard(name, e.PathPrefix) - r, err := e.get(path, true) + r, err := e.get(path, !exact) if err != nil { return nil, err }