mirror of
https://github.com/nadoo/glider.git
synced 2025-02-23 17:35:40 +08:00
dns: fixed a bug in compressed domain offset calculation
This commit is contained in:
parent
40f3315007
commit
41ddbb1168
@ -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
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user