summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2024-02-10 22:31:40 +0700
committerShulhan <ms@kilabit.info>2024-02-25 20:09:33 +0700
commitf2e329f477a4f30c0b88880e0b6a665dcc7dd4a2 (patch)
tree3f22ba2bd8bcf8ba1df69d8a9aa3a4b8463a304d
parentb965c0d4cbfa1a29890ddbae50f95dae78a78b1a (diff)
downloadpakakeh.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.go10
-rw-r--r--lib/dns/message.go8
-rw-r--r--lib/dns/server.go12
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)