aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2019-04-26 03:13:50 +0700
committerShulhan <ms@kilabit.info>2019-05-07 18:08:01 +0700
commit2228edf127bbf9a1cb1dbac5879f8b8b0aa3b68c (patch)
tree51193faf3ffa05b5dc7adb7b2459d8d10f307498
parentdb3639e3e614ab9fd4f2b526af35683309c46b7e (diff)
downloadpakakeh.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.go34
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())
}
}