From c2e309e2e4ab1bd90d5c4ab73b918d735a41a8e6 Mon Sep 17 00:00:00 2001 From: Yong Tang Date: Thu, 3 Sep 2026 01:11:33 -0700 Subject: [PATCH] plugin/cache: Prevents a nil pointer dereference panic in the cache prefetch (#8512) * plugin/cache: Prevents a nil pointer dereference panic in the cache prefetch This PR prevents a nil pointer dereference panic in the cache prefetch, by adding nil guards Signed-off-by: Yong Tang * Address comment Signed-off-by: Yong Tang --------- Signed-off-by: Yong Tang --- plugin/cache/cache.go | 4 ++++ plugin/cache/cache_test.go | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/plugin/cache/cache.go b/plugin/cache/cache.go index b2a2f6520..8cb49dceb 100644 --- a/plugin/cache/cache.go +++ b/plugin/cache/cache.go @@ -3,6 +3,7 @@ package cache import ( "encoding/binary" + "fmt" "hash/fnv" "net" "strings" @@ -413,6 +414,9 @@ func (w *ResponseWriter) Hijack() { // WriteMsg implements the dns.ResponseWriter interface. func (w *ResponseWriter) WriteMsg(res *dns.Msg) error { + if res == nil { + return fmt.Errorf("cache: response message is nil") + } res = res.Copy() w.lastItem = nil mt := cacheResponseType(res, w.now().UTC()) diff --git a/plugin/cache/cache_test.go b/plugin/cache/cache_test.go index 50f80bf5c..0fbaf390b 100644 --- a/plugin/cache/cache_test.go +++ b/plugin/cache/cache_test.go @@ -1990,3 +1990,21 @@ func TestServeFromStaleCacheFetchVerifyTimeoutMetadataIsolation(t *testing.T) { t.Fatalf("background verifier mutated foreground metadata: %q", f()) } } + +func TestCacheWriteMsgNilResponse(t *testing.T) { + c := New() + + rec := dnstest.NewRecorder(&test.ResponseWriter{}) + cw := &ResponseWriter{ResponseWriter: rec, Cache: c} + + defer func() { + if r := recover(); r != nil { + t.Fatalf("ResponseWriter.WriteMsg panicked on nil response: %v", r) + } + }() + + err := cw.WriteMsg(nil) + if err == nil { + t.Error("Expected error when passing nil response to WriteMsg, got nil") + } +}