dns: fixed a bug in compressed domain offset calculation

This commit is contained in:
nadoo 2018-07-30 10:31:02 +08:00
parent 40f3315007
commit 41ddbb1168

View File

@ -3,9 +3,7 @@ package dns
import ( import (
"bytes" "bytes"
"encoding/binary" "encoding/binary"
"encoding/hex"
"errors" "errors"
"fmt"
"math/rand" "math/rand"
"net" "net"
"strings" "strings"
@ -117,8 +115,6 @@ func UnmarshalMessage(b []byte) (*Message, error) {
msg := NewMessage() msg := NewMessage()
msg.unMarshaled = b msg.unMarshaled = b
fmt.Printf("msg.unMarshaled:\n%s\n", hex.Dump(msg.unMarshaled))
err := UnmarshalHeader(b[:HeaderLen], msg.Header) err := UnmarshalHeader(b[:HeaderLen], msg.Header)
if err != nil { if err != nil {
return nil, err return nil, err
@ -286,7 +282,7 @@ func (m *Message) UnmarshalQuestion(b []byte, q *Question) (n int, err error) {
return 0, errors.New("unmarshal question must not be nil") return 0, errors.New("unmarshal question must not be nil")
} }
domain, idx := m.GetDomain(b) domain, idx := m.UnmarshalDomain(b)
q.QNAME = domain q.QNAME = domain
q.QTYPE = binary.BigEndian.Uint16(b[idx : idx+2]) q.QTYPE = binary.BigEndian.Uint16(b[idx : idx+2])
q.QCLASS = binary.BigEndian.Uint16(b[idx+2 : idx+4]) q.QCLASS = binary.BigEndian.Uint16(b[idx+2 : idx+4])
@ -347,9 +343,7 @@ func (m *Message) UnmarshalRR(start int, rr *RR) (n int, err error) {
p := m.unMarshaled[start:] p := m.unMarshaled[start:]
fmt.Printf("rr bytes:\n%s\n", hex.Dump(p[:10])) domain, n := m.UnmarshalDomain(p)
domain, n := m.GetDomain(p)
rr.NAME = domain rr.NAME = domain
if len(p) <= n+10 { if len(p) <= n+10 {
@ -370,8 +364,6 @@ func (m *Message) UnmarshalRR(start int, rr *RR) (n int, err error) {
n = n + 10 + int(rr.RDLENGTH) n = n + 10 + int(rr.RDLENGTH)
fmt.Printf("rr: %+#v\n", rr)
return n, nil return n, nil
} }
@ -388,8 +380,8 @@ func MarshalDomain(domain string) []byte {
return buf.Bytes() return buf.Bytes()
} }
// GetDomain gets domain from bytes // UnmarshalDomain gets domain from bytes
func (m *Message) GetDomain(b []byte) (string, int) { func (m *Message) UnmarshalDomain(b []byte) (string, int) {
var idx, size int var idx, size int
var labels = []string{} var labels = []string{}
@ -401,7 +393,7 @@ func (m *Message) GetDomain(b []byte) (string, int) {
// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
if b[idx]&0xC0 == 0xC0 { if b[idx]&0xC0 == 0xC0 {
offset := binary.BigEndian.Uint16(b[idx : idx+2]) offset := binary.BigEndian.Uint16(b[idx : idx+2])
lable := m.GetDomainByPoint(int(offset & 0x3F)) lable := m.UnmarshalDomainPoint(int(offset & 0x3FFF))
labels = append(labels, lable) labels = append(labels, lable)
idx += 2 idx += 2
break break
@ -420,9 +412,8 @@ func (m *Message) GetDomain(b []byte) (string, int) {
return domain, idx return domain, idx
} }
// GetDomainByPoint gets domain from // UnmarshalDomainPoint gets domain from offset point
func (m *Message) GetDomainByPoint(offset int) string { func (m *Message) UnmarshalDomainPoint(offset int) string {
domain, _ := m.GetDomain(m.unMarshaled[offset:]) domain, _ := m.UnmarshalDomain(m.unMarshaled[offset:])
fmt.Printf("GetDomainByPoint: %02x\n", offset)
return domain return domain
} }