From 96a587bba9afec5efa0ea0685d29bcf6ee4a44b8 Mon Sep 17 00:00:00 2001 From: Mike Degatano Date: Fri, 4 Mar 2022 04:22:17 -0500 Subject: [PATCH] Return noerror if any answers found (A or AAAA) (#81) --- plugins/mdns/mdns.go | 10 ++++++---- plugins/mdns/mdns_test.go | 2 ++ plugins/mdns/setup.go | 4 ++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/plugins/mdns/mdns.go b/plugins/mdns/mdns.go index c4d28bc..f05e36b 100644 --- a/plugins/mdns/mdns.go +++ b/plugins/mdns/mdns.go @@ -34,8 +34,12 @@ func (m MDNS) AddARecord(msg *dns.Msg, state *request.Request, name string, addr // Add A and AAAA record for name (if it exists) to msg. // A records need to be returned in A queries, this function // provides common code for doing so. + // Success is always returned if any answers found, even if they don't match question type + // A noerror on A and nxdomain on AAAA (or vice versa) breaks some clients (musl) + if len(addresses) == 0 { + return false + } - resolved := false ifc_index := 0 for i := 0; i < len(addresses); i++ { addr := addresses[i] @@ -55,15 +59,13 @@ func (m MDNS) AddARecord(msg *dns.Msg, state *request.Request, name string, addr } else { msg.Answer = append(msg.Answer, &dns.A{Hdr: aheader, A: ip}) } - resolved = true } else if addr.V1 == syscall.AF_INET6 && state.QType() == dns.TypeAAAA { aaaaheader := dns.RR_Header{Name: name, Rrtype: dns.TypeAAAA, Class: dns.ClassINET, Ttl: 60} msg.Answer = append(msg.Answer, &dns.AAAA{Hdr: aaaaheader, AAAA: ip}) - resolved = true } } - return resolved + return true } func (m MDNS) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) { diff --git a/plugins/mdns/mdns_test.go b/plugins/mdns/mdns_test.go index 4d95399..1fa89b6 100644 --- a/plugins/mdns/mdns_test.go +++ b/plugins/mdns/mdns_test.go @@ -91,6 +91,8 @@ func TestAddARecord(t *testing.T) { "myservice.local 60 IN A 192.168.1.1", "myservice.local 60 IN A 10.1.1.1", }, true}, + {"success on AAAA if only A found", "mymachine.local", dns.TypeAAAA, nilResponseWriter{}, 1, ipv4, []string{}, true}, + {"success on A if only AAAA found", "mymachine.local", dns.TypeA, nilResponseWriter{}, 1, ipv6, []string{}, true}, } for _, tc := range testCases { m := MDNS{nil, nil, tc.ifc} diff --git a/plugins/mdns/setup.go b/plugins/mdns/setup.go index d407027..ca260fc 100644 --- a/plugins/mdns/setup.go +++ b/plugins/mdns/setup.go @@ -21,12 +21,12 @@ func setup(c *caddy.Controller) error { var m MDNS conn, err := dbus.ConnectSystemBus() if err != nil { - log.Error("could not connect to systemd resolver due to %s", err) + log.Error("could not connect to systemd resolver due to: ", err) log.Error("mdns and llmnr urls will not resolve in without this") m = MDNS{ Resolver: nil, - Ifc: 0, + Ifc: 0, } } else { bus_object := conn.Object("org.freedesktop.resolve1", "/org/freedesktop/resolve1")