diff options
| author | Shulhan <ms@kilabit.info> | 2024-02-10 22:31:40 +0700 |
|---|---|---|
| committer | Shulhan <ms@kilabit.info> | 2024-02-25 20:09:33 +0700 |
| commit | f2e329f477a4f30c0b88880e0b6a665dcc7dd4a2 (patch) | |
| tree | 3f22ba2bd8bcf8ba1df69d8a9aa3a4b8463a304d | |
| parent | b965c0d4cbfa1a29890ddbae50f95dae78a78b1a (diff) | |
| download | pakakeh.go-f2e329f477a4f30c0b88880e0b6a665dcc7dd4a2.tar.xz | |
lib/dns: ignore invalid message
If Query return a message but the failed to unpack due to invalid
format, for example
unpackOPT: data length is out of range
ignore it instead of disconnect the client connection.
| -rw-r--r-- | lib/dns/error.go | 10 | ||||
| -rw-r--r-- | lib/dns/message.go | 8 | ||||
| -rw-r--r-- | lib/dns/server.go | 12 |
3 files changed, 23 insertions, 7 deletions
diff --git a/lib/dns/error.go b/lib/dns/error.go new file mode 100644 index 00000000..15748c1d --- /dev/null +++ b/lib/dns/error.go @@ -0,0 +1,10 @@ +// Copyright 2024, Shulhan <ms@kilabit.info>. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package dns + +import "errors" + +// errUnpack define an error if packet failed to be parsed. +var errUnpack = errors.New(`unpack: invalid message`) diff --git a/lib/dns/message.go b/lib/dns/message.go index 0fbd3fa8..fb615487 100644 --- a/lib/dns/message.go +++ b/lib/dns/message.go @@ -964,7 +964,7 @@ func (msg *Message) String() string { func (msg *Message) Unpack() (err error) { err = msg.UnpackHeaderQuestion() if err != nil { - return err + return fmt.Errorf(`%w: %w`, errUnpack, err) } var ( @@ -978,7 +978,7 @@ func (msg *Message) Unpack() (err error) { startIdx, err = rr.unpack(msg.packet, startIdx) if err != nil { - return err + return fmt.Errorf(`%w: %w`, errUnpack, err) } msg.Answer = append(msg.Answer, rr) @@ -989,7 +989,7 @@ func (msg *Message) Unpack() (err error) { startIdx, err = rr.unpack(msg.packet, startIdx) if err != nil { - return err + return fmt.Errorf(`%w: %w`, errUnpack, err) } msg.Authority = append(msg.Authority, rr) } @@ -999,7 +999,7 @@ func (msg *Message) Unpack() (err error) { startIdx, err = rr.unpack(msg.packet, startIdx) if err != nil { - return err + return fmt.Errorf(`%w: %w`, errUnpack, err) } msg.Additional = append(msg.Additional, rr) diff --git a/lib/dns/server.go b/lib/dns/server.go index b0c4f734..a7512ec9 100644 --- a/lib/dns/server.go +++ b/lib/dns/server.go @@ -809,7 +809,9 @@ func (srv *Server) dohForwarder(tag, nameserver string) { if err != nil { log.Printf(`%s %s: forward failed for %q: %s`, logp, tag, req.message.Question.Name, err) - isRunning = false + if !errors.Is(err, errUnpack) { + isRunning = false + } continue } srv.processResponse(req, res) @@ -886,7 +888,9 @@ func (srv *Server) tlsForwarder(tag, nameserver string) { if err != nil { log.Printf(`%s %s: forward failed for %s: %s`, logp, tag, req.message.Question.Name, err) - isRunning = false + if !errors.Is(err, errUnpack) { + isRunning = false + } continue } @@ -1035,7 +1039,9 @@ func (srv *Server) udpForwarder(tag, nameserver string) { log.Printf(`%s %s: forward failed for %s: %s`, logp, tag, req.message.Question.Name, err) - isRunning = false + if !errors.Is(err, errUnpack) { + isRunning = false + } continue } srv.processResponse(req, res) |
