diff --git a/nameserver/dns.go b/nameserver/dns.go index c633af2a..cf2eefb6 100644 --- a/nameserver/dns.go +++ b/nameserver/dns.go @@ -247,19 +247,12 @@ func (h *handler) makeResponse(req *dns.Msg, answers []dns.RR) *dns.Msg { response.RecursionAvailable = true response.Authoritative = true response.Answer = answers - h.truncateResponse(req, response) - return response -} -func (h *handler) truncateResponse(req, response *dns.Msg) { maxSize := h.getMaxResponseSize(req) if len(response.Answer) <= 1 || maxSize <= 0 { - return + return response } - // take a copy of answers, as we're going to mutate response - answers := response.Answer - // search for smallest i that is too big i := sort.Search(len(response.Answer), func(i int) bool { // return true if too big @@ -268,11 +261,12 @@ func (h *handler) truncateResponse(req, response *dns.Msg) { }) if i == len(answers) { response.Answer = answers - return + return response } response.Answer = answers[:i] response.Truncated = true + return response } func (h *handler) getMaxResponseSize(req *dns.Msg) int { diff --git a/nameserver/dns_test.go b/nameserver/dns_test.go index c7152238..9352b24c 100644 --- a/nameserver/dns_test.go +++ b/nameserver/dns_test.go @@ -83,18 +83,17 @@ func TestTruncateResponse(t *testing.T) { } for i := 0; i < 10000; i++ { - // generate a random msg - response := &dns.Msg{} + // generate a random answer set numAnswers := 40 + rand.Intn(200) - response.Answer = make([]dns.RR, numAnswers) + answers := make([]dns.RR, numAnswers) for j := 0; j < numAnswers; j++ { - response.Answer[j] = &dns.A{Hdr: header, A: address.Address(j).IP4()} + answers[j] = &dns.A{Hdr: header, A: address.Address(j).IP4()} } // pick a random max size, truncate response to that, check it - maxSize := 512 + rand.Intn(response.Len()-512) + maxSize := 512 + rand.Intn(2*512) h := handler{maxResponseSize: maxSize} - h.truncateResponse(&dns.Msg{}, response) + response := h.makeResponse(&dns.Msg{}, answers) require.True(t, response.Len() <= maxSize) } }