From 63d28fc9b298221cd6f409fbfec5b37b700b13a8 Mon Sep 17 00:00:00 2001 From: Frank Denis Date: Wed, 5 Feb 2020 02:44:43 +0100 Subject: [PATCH] Forwarding plugin: retry over TCP if a truncated response is received dns.Exchange() doesn't do it automatically. Fixes #1178 --- dnscrypt-proxy/plugin_forward.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/dnscrypt-proxy/plugin_forward.go b/dnscrypt-proxy/plugin_forward.go index 79afb362..147916fd 100644 --- a/dnscrypt-proxy/plugin_forward.go +++ b/dnscrypt-proxy/plugin_forward.go @@ -89,10 +89,18 @@ func (plugin *PluginForward) Eval(pluginsState *PluginsState, msg *dns.Msg) erro } server := servers[rand.Intn(len(servers))] pluginsState.serverName = server - respMsg, err := dns.Exchange(msg, server) + client := dns.Client{Net: "udp"} + respMsg, _, err := client.Exchange(msg, server) if err != nil { return err } + if respMsg.Truncated { + client.Net = "tcp" + respMsg, _, err = client.Exchange(msg, server) + if err != nil { + return err + } + } if edns0 := respMsg.IsEdns0(); edns0 == nil || !edns0.Do() { respMsg.AuthenticatedData = false }