commit fcbc0eaeb5ac159cd2b10e70e5deaae703cf5189 from: Oliver Lowe date: Fri Nov 19 01:58:15 2021 UTC error on receiving a message with the wrong message ID commit - 692accac0fc8763da7b9063b1948fa08415b4b7f commit + fcbc0eaeb5ac159cd2b10e70e5deaae703cf5189 blob - 09de8bd500a03b7e42c6fa1c3ba887712ceaaa27 blob + 2d61b9775799401549b02a7326771ac4704a9098 --- dns.go +++ 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) (dnsm 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 }