diff options
author | 2023-09-07 12:01:45 -0700 | |
---|---|---|
committer | 2023-09-07 15:01:45 -0400 | |
commit | 4c69549832286d6a4e7e6ac67d2e4df836dc47c4 (patch) | |
tree | 0c44a280332eac55a6e76434da4f2b74889f3022 /plugin/pkg/proxy/proxy_test.go | |
parent | 1a57825f0e16bdeb9e4d509165681f3c9647537e (diff) | |
download | coredns-4c69549832286d6a4e7e6ac67d2e4df836dc47c4.tar.gz coredns-4c69549832286d6a4e7e6ac67d2e4df836dc47c4.tar.zst coredns-4c69549832286d6a4e7e6ac67d2e4df836dc47c4.zip |
Handle UDP responses that overflow with TC bit with test case (#6277)
Signed-off-by: SriHarshaBS001 <SriHarshaBS009@gmail.com>
Diffstat (limited to 'plugin/pkg/proxy/proxy_test.go')
-rw-r--r-- | plugin/pkg/proxy/proxy_test.go | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/plugin/pkg/proxy/proxy_test.go b/plugin/pkg/proxy/proxy_test.go index 33a7170c0..03d10ce5f 100644 --- a/plugin/pkg/proxy/proxy_test.go +++ b/plugin/pkg/proxy/proxy_test.go @@ -3,6 +3,7 @@ package proxy import ( "context" "crypto/tls" + "errors" "math" "testing" "time" @@ -128,3 +129,97 @@ func TestProxyIncrementFails(t *testing.T) { }) } } + +func TestCoreDNSOverflow(t *testing.T) { + s := dnstest.NewServer(func(w dns.ResponseWriter, r *dns.Msg) { + ret := new(dns.Msg) + ret.SetReply(r) + + answers := []dns.RR{ + test.A("example.org. IN A 127.0.0.1"), + test.A("example.org. IN A 127.0.0.2"), + test.A("example.org. IN A 127.0.0.3"), + test.A("example.org. IN A 127.0.0.4"), + test.A("example.org. IN A 127.0.0.5"), + test.A("example.org. IN A 127.0.0.6"), + test.A("example.org. IN A 127.0.0.7"), + test.A("example.org. IN A 127.0.0.8"), + test.A("example.org. IN A 127.0.0.9"), + test.A("example.org. IN A 127.0.0.10"), + test.A("example.org. IN A 127.0.0.11"), + test.A("example.org. IN A 127.0.0.12"), + test.A("example.org. IN A 127.0.0.13"), + test.A("example.org. IN A 127.0.0.14"), + test.A("example.org. IN A 127.0.0.15"), + test.A("example.org. IN A 127.0.0.16"), + test.A("example.org. IN A 127.0.0.17"), + test.A("example.org. IN A 127.0.0.18"), + test.A("example.org. IN A 127.0.0.19"), + test.A("example.org. IN A 127.0.0.20"), + } + ret.Answer = answers + w.WriteMsg(ret) + }) + defer s.Close() + + p := NewProxy("TestCoreDNSOverflow", s.Addr, transport.DNS) + p.readTimeout = 10 * time.Millisecond + p.Start(5 * time.Second) + defer p.Stop() + + // Test different connection modes + testConnection := func(proto string, options Options, expectTruncated bool) { + t.Helper() + + queryMsg := new(dns.Msg) + queryMsg.SetQuestion("example.org.", dns.TypeA) + + recorder := dnstest.NewRecorder(&test.ResponseWriter{}) + request := request.Request{Req: queryMsg, W: recorder} + + response, err := p.Connect(context.Background(), request, options) + if err != nil { + t.Errorf("Failed to connect to testdnsserver: %s", err) + } + + if response.Truncated != expectTruncated { + t.Errorf("Expected truncated response for %s, but got TC flag %v", proto, response.Truncated) + } + } + + // Test PreferUDP, expect truncated response + testConnection("PreferUDP", Options{PreferUDP: true}, true) + + // Test ForceTCP, expect no truncated response + testConnection("ForceTCP", Options{ForceTCP: true}, false) + + // Test No options specified, expect truncated response + testConnection("NoOptionsSpecified", Options{}, true) + + // Test both TCP and UDP provided, expect no truncated response + testConnection("BothTCPAndUDP", Options{PreferUDP: true, ForceTCP: true}, false) +} + +func TestShouldTruncateResponse(t *testing.T) { + testCases := []struct { + testname string + err error + expected bool + }{ + {"BadAlgorithm", dns.ErrAlg, false}, + {"BufferSizeTooSmall", dns.ErrBuf, true}, + {"OverflowUnpackingA", errors.New("overflow unpacking a"), true}, + {"OverflowingHeaderSize", errors.New("overflowing header size"), true}, + {"OverflowpackingA", errors.New("overflow packing a"), true}, + {"ErrSig", dns.ErrSig, false}, + } + + for _, tc := range testCases { + t.Run(tc.testname, func(t *testing.T) { + result := shouldTruncateResponse(tc.err) + if result != tc.expected { + t.Errorf("For testname '%v', expected %v but got %v", tc.testname, tc.expected, result) + } + }) + } +} |