From 2228edf127bbf9a1cb1dbac5879f8b8b0aa3b68c Mon Sep 17 00:00:00 2001 From: Shulhan Date: Fri, 26 Apr 2019 03:13:50 +0700 Subject: dns: restart UDP forwarder on error When UDP client got read timeout, the next read from the same connection may read the previous response. This will cause a mismatch between request and response for subsequence forward operations. To handle this, we close the UDP connection and start a new one. --- lib/dns/server.go | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/lib/dns/server.go b/lib/dns/server.go index 386f0b31..4e7a9785 100644 --- a/lib/dns/server.go +++ b/lib/dns/server.go @@ -691,23 +691,29 @@ func (srv *Server) runTCPForwarder(remoteAddr *net.TCPAddr) { } func (srv *Server) runUDPForwarder(remoteAddr *net.UDPAddr) { - forwarder, err := NewUDPClient(remoteAddr.String()) - if err != nil { - log.Fatal("dns: failed to create UDP forwarder: " + err.Error()) - } - - for req := range srv.forwardq { - if debug.Value >= 1 { - fmt.Printf("dns: ^ UDP %d:%s\n", - req.message.Header.ID, req.message.Question) + for { + forwarder, err := NewUDPClient(remoteAddr.String()) + if err != nil { + log.Fatal("dns: failed to create UDP forwarder: " + err.Error()) } - res, err := forwarder.Query(req.message) - if err != nil { - log.Println("dns: failed to query UDP: " + err.Error()) - continue + for req := range srv.forwardq { + if debug.Value >= 1 { + fmt.Printf("dns: ^ UDP %d:%s\n", + req.message.Header.ID, req.message.Question) + } + + res, err := forwarder.Query(req.message) + if err != nil { + log.Println("dns: failed to query UDP: " + err.Error()) + break + } + + srv.processResponse(req, res, false) } - srv.processResponse(req, res, false) + forwarder.Close() + + log.Println("dns: restarting UDP forwarder for " + remoteAddr.String()) } } -- cgit v1.3