dns

DNS client and server implementations using the Go project's dnsmessage package
Log | Files | Refs | README | LICENSE

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:
Mdns.go | 10++++++++--
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 }