diff options
author | 2020-10-15 16:47:07 +0200 | |
---|---|---|
committer | 2020-10-15 07:47:07 -0700 | |
commit | 268781d3553cca94f5e5ecbd248a537fbdf6dae8 (patch) | |
tree | 21c5e80cbdceca2e85bcc282ca77add3df8fc634 /test | |
parent | 6938dac21d9a79bc34f4347a52fda4d1bf24b259 (diff) | |
download | coredns-268781d3553cca94f5e5ecbd248a537fbdf6dae8.tar.gz coredns-268781d3553cca94f5e5ecbd248a537fbdf6dae8.tar.zst coredns-268781d3553cca94f5e5ecbd248a537fbdf6dae8.zip |
cache: do the msg copy right (#4207)
Not sure why this is proving so difficult.. pointers are hard? [Was
tempted to rollback all tweaks here, but the original issue we're fixing
it too important to not have a proper fix].
But we need to make a copy of the message at the earliest point in the
handler because we are changing it (adding an opt rr). If we do this on
the original message (which is a pointer) we change it (obvs). When
undoing those changes we do work on a copy.
Re: testing. There isn't a explicit test for this, so I've added on to
the top-level test/ directory, which indeed makes the issue visible:
master:
~~~
go test -v -run=TestLookupCacheWithoutEdns
=== RUN TestLookupCacheWithoutEdns
cache_test.go:154: Expected no OPT RR, but got:
;; OPT PSEUDOSECTION:
; EDNS: version 0; flags: do; udp: 2048
--- FAIL: TestLookupCacheWithoutEdns (0.01s)
FAIL
~~~
This branch:
~~~
% go test -v -run=TestLookupCacheWithoutEdns
=== RUN TestLookupCacheWithoutEdns
--- PASS: TestLookupCacheWithoutEdns (0.01s)
PASS
ok github.com/coredns/coredns/test 0.109s
~~~
Signed-off-by: Miek Gieben <miek@miek.nl>
Diffstat (limited to 'test')
-rw-r--r-- | test/cache_test.go | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/test/cache_test.go b/test/cache_test.go index 24bd7e051..831c39fa5 100644 --- a/test/cache_test.go +++ b/test/cache_test.go @@ -110,3 +110,48 @@ func testCaseDNSSEC(t *testing.T, name, addr string, bufsize int) { } } } + +func TestLookupCacheWithoutEdns(t *testing.T) { + name, rm, err := test.TempFile(".", exampleOrg) + if err != nil { + t.Fatalf("Failed to create zone: %s", err) + } + defer rm() + + corefile := `example.org:0 { + file ` + name + ` + }` + + i, udp, _, err := CoreDNSServerAndPorts(corefile) + if err != nil { + t.Fatalf("Could not get CoreDNS serving instance: %s", err) + } + defer i.Stop() + + // Start caching forward CoreDNS that we want to test. + corefile = `example.org:0 { + forward . ` + udp + ` + cache 10 + }` + + i, udp, _, err = CoreDNSServerAndPorts(corefile) + if err != nil { + t.Fatalf("Could not get CoreDNS serving instance: %s", err) + } + defer i.Stop() + + m := new(dns.Msg) + m.SetQuestion("example.org.", dns.TypeA) + resp, err := dns.Exchange(m, udp) + if err != nil { + t.Fatalf("Expected to receive reply, but didn't: %s", err) + } + if len(resp.Extra) == 0 { + return + } + + if resp.Extra[0].Header().Rrtype == dns.TypeOPT { + t.Fatalf("Expected no OPT RR, but got: %s", resp.Extra[0]) + } + t.Fatalf("Expected empty additional section, got %v", resp.Extra) +} |