From 154507205761afc09f3c3bd3887e3cdd2ff404c9 Mon Sep 17 00:00:00 2001 From: Yaroslav Kolomiiets Date: Thu, 23 May 2019 20:54:24 +0100 Subject: [PATCH] ignore Z flag in queries, clear Z flag in automatic replies (#976) --- acceptfunc.go | 3 --- server.go | 1 + server_test.go | 28 ++++++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/acceptfunc.go b/acceptfunc.go index 78c076c2..94e7c9d9 100644 --- a/acceptfunc.go +++ b/acceptfunc.go @@ -35,9 +35,6 @@ func defaultMsgAcceptFunc(dh Header) MsgAcceptAction { return MsgReject } - if isZero := dh.Bits&_Z != 0; isZero { - return MsgReject - } if dh.Qdcount != 1 { return MsgReject } diff --git a/server.go b/server.go index 97cc87a7..354f7712 100644 --- a/server.go +++ b/server.go @@ -571,6 +571,7 @@ func (srv *Server) serveDNS(m []byte, w *response) { req.SetRcodeFormatError(req) // Are we allowed to delete any OPT records here? req.Ns, req.Answer, req.Extra = nil, nil, nil + req.Zero = false w.WriteMsg(req) fallthrough diff --git a/server_test.go b/server_test.go index d850b8e4..9037f1a8 100644 --- a/server_test.go +++ b/server_test.go @@ -187,6 +187,34 @@ func TestServing(t *testing.T) { } } +// Verify that the server responds to a query with Z flag on, ignoring the flag, and does not echoes it back +func TestServeIgnoresZFlag(t *testing.T) { + HandleFunc("example.com.", AnotherHelloServer) + + s, addrstr, err := RunLocalUDPServer(":0") + if err != nil { + t.Fatalf("unable to run test server: %v", err) + } + defer s.Shutdown() + + c := new(Client) + m := new(Msg) + + // Test the Z flag is not echoed + m.SetQuestion("example.com.", TypeTXT) + m.Zero = true + r, _, err := c.Exchange(m, addrstr) + if err != nil { + t.Fatal("failed to exchange example.com with +zflag", err) + } + if r.Zero { + t.Error("the response should not have Z flag set - even for a query which does") + } + if r.Rcode != RcodeSuccess { + t.Errorf("expected rcode %v, got %v", RcodeSuccess, r.Rcode) + } +} + func TestServingTLS(t *testing.T) { HandleFunc("miek.nl.", HelloServer) HandleFunc("example.com.", AnotherHelloServer)