From 594d6c9121887ca6160ebc785d471e4618097df2 Mon Sep 17 00:00:00 2001 From: Yong Tang Date: Tue, 29 Sep 2026 01:19:07 -0700 Subject: [PATCH] plugin/file: Fix race condition in file plugin closer (#8583) This PR fixes race condition in file plugin closer Signed-off-by: Yong Tang --- plugin/file/closest.go | 9 +++++++-- plugin/file/closest_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/plugin/file/closest.go b/plugin/file/closest.go index 7a8efd5d9..d060f435f 100644 --- a/plugin/file/closest.go +++ b/plugin/file/closest.go @@ -8,9 +8,14 @@ import ( // ClosestEncloser returns the closest encloser for qname. func (z *Zone) ClosestEncloser(qname string) (*tree.Elem, bool) { + _, zoneTree := z.snapshot() + if zoneTree == nil { + return nil, false + } + offset, end := dns.NextLabel(qname, 0) for !end { - elem, _ := z.Search(qname) + elem, _ := zoneTree.Search(qname) if elem != nil { return elem, true } @@ -19,5 +24,5 @@ func (z *Zone) ClosestEncloser(qname string) (*tree.Elem, bool) { offset, end = dns.NextLabel(qname, 0) } - return z.Search(z.origin) + return zoneTree.Search(z.origin) } diff --git a/plugin/file/closest_test.go b/plugin/file/closest_test.go index 282823fcc..09c173f3a 100644 --- a/plugin/file/closest_test.go +++ b/plugin/file/closest_test.go @@ -37,3 +37,27 @@ func TestClosestEncloser(t *testing.T) { } } } + +func TestClosestEncloserConcurrentSetData(t *testing.T) { + z, err := Parse(strings.NewReader(dbMiekNL), testzone, "stdin", 0) + if err != nil { + t.Fatalf("Expect no error when reading zone, got %q", err) + } + + apex, zoneTree := z.snapshot() + start := make(chan struct{}) + done := make(chan struct{}) + go func() { + defer close(done) + <-start + for range 10000 { + z.setData(apex, zoneTree) + } + }() + + close(start) + for range 10000 { + z.ClosestEncloser("blaat.www.miek.nl.") + } + <-done +}