diff options
| author | Shulhan <ms@kilabit.info> | 2019-04-26 03:13:50 +0700 |
|---|---|---|
| committer | Shulhan <ms@kilabit.info> | 2019-05-07 18:08:01 +0700 |
| commit | 2228edf127bbf9a1cb1dbac5879f8b8b0aa3b68c (patch) | |
| tree | 51193faf3ffa05b5dc7adb7b2459d8d10f307498 | |
| parent | db3639e3e614ab9fd4f2b526af35683309c46b7e (diff) | |
| download | pakakeh.go-2228edf127bbf9a1cb1dbac5879f8b8b0aa3b68c.tar.xz | |
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.
| -rw-r--r-- | lib/dns/server.go | 34 |
1 files 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()) } } |
