From d8191a1ee6d7e398fc6b1929fc94631b5ccdf9f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Fri, 5 Sep 2025 16:23:30 +0800 Subject: [PATCH] Treat requests with OPT extra but no options as simple requests --- dns/client.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/dns/client.go b/dns/client.go index 89acc971..865bdaec 100644 --- a/dns/client.go +++ b/dns/client.go @@ -19,7 +19,7 @@ import ( "github.com/sagernet/sing/contrab/freelru" "github.com/sagernet/sing/contrab/maphash" - dns "github.com/miekg/dns" + "github.com/miekg/dns" ) var ( @@ -116,9 +116,14 @@ func (c *Client) Exchange(ctx context.Context, transport adapter.DNSTransport, m if clientSubnet.IsValid() { message = SetClientSubnet(message, clientSubnet) } + isSimpleRequest := len(message.Question) == 1 && len(message.Ns) == 0 && - len(message.Extra) == 0 && + (len(message.Extra) == 0 || len(message.Extra) == 1 && + message.Extra[0].Header().Rrtype == dns.TypeOPT && + message.Extra[0].Header().Class > 0 && + message.Extra[0].Header().Ttl == 0 && + len(message.Extra[0].(*dns.OPT).Option) == 0) && !options.ClientSubnet.IsValid() disableCache := !isSimpleRequest || c.disableCache || options.DisableCache if !disableCache {