commit fcbc0eaeb5ac159cd2b10e70e5deaae703cf5189
parent 692accac0fc8763da7b9063b1948fa08415b4b7f
Author: Oliver Lowe <o@olowe.co>
Date: Fri, 19 Nov 2021 12:58:15 +1100
error on receiving a message with the wrong message ID
Diffstat:
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/dns.go b/dns.go
@@ -3,6 +3,7 @@ package dns
import (
"crypto/tls"
"encoding/binary"
+ "errors"
"fmt"
"net"
@@ -13,6 +14,8 @@ import (
const MediaType string = "application/dns-message"
const MaxMsgSize int = 65535 // max size of a message in bytes
+var errMismatchedID = errors.New("mismatched message id")
+
// Exchange performs a synchronous, unencrypted UDP DNS exchange with addr and returns its
// reply to msg.
func Exchange(msg dnsmessage.Message, addr string) (dnsmessage.Message, error) {
@@ -44,18 +47,21 @@ func send(msg dnsmessage.Message, conn net.Conn) (dnsmessage.Message, error) {
if _, ok := conn.(net.PacketConn); ok {
b, err = dnsPacketExchange(packed, conn)
if err != nil {
- return dnsmessage.Message{}, fmt.Errorf("exchange DNS packet: %v", err)
+ return dnsmessage.Message{}, fmt.Errorf("exchange DNS packet: %w", err)
}
} else {
b, err = dnsStreamExchange(packed, conn)
if err != nil {
- return dnsmessage.Message{}, fmt.Errorf("exchange DNS TCP stream: %v", err)
+ return dnsmessage.Message{}, fmt.Errorf("exchange DNS TCP stream: %w", err)
}
}
var rmsg dnsmessage.Message
if err := rmsg.Unpack(b); err != nil {
return dnsmessage.Message{}, fmt.Errorf("parse response: %v", err)
}
+ if rmsg.Header.ID != msg.Header.ID {
+ return rmsg, errMismatchedID
+ }
return rmsg, nil
}