Revert "Use dLen for domain name length"

This reverts commit b595183834.

Fix up the tests too.
This commit is contained in:
Miek Gieben 2014-02-14 20:20:22 +00:00
parent 83efab6078
commit 87b380cad5
4 changed files with 40 additions and 49 deletions

2
dns.go
View File

@ -166,7 +166,7 @@ func (h *RR_Header) String() string {
} }
func (h *RR_Header) len() int { func (h *RR_Header) len() int {
l := dLen(h.Name) l := len(h.Name) + 1
l += 10 // rrtype(2) + class(2) + ttl(4) + rdlength(2) l += 10 // rrtype(2) + class(2) + ttl(4) + rdlength(2)
return l return l
} }

View File

@ -229,14 +229,14 @@ func TestMsgCompressLength(t *testing.T) {
makeMsg(name1, []RR{rrMx, rrMx}, nil, nil)} makeMsg(name1, []RR{rrMx, rrMx}, nil, nil)}
for _, msg := range tests { for _, msg := range tests {
predicted := msg.Len() - 1 predicted := msg.Len()
buf, err := msg.Pack() buf, err := msg.Pack()
if err != nil { if err != nil {
t.Error(err) t.Error(err)
t.Fail() t.Fail()
} }
if predicted != len(buf) { if predicted < len(buf) {
t.Errorf("Predicted length is wrong: predicted %s (len=%d) %d, actual %d\n", t.Errorf("Predicted compressed length is wrong: predicted %s (len=%d) %d, actual %d\n",
msg.Question[0].Name, len(msg.Answer), predicted, len(buf)) msg.Question[0].Name, len(msg.Answer), predicted, len(buf))
t.Fail() t.Fail()
} }
@ -261,14 +261,14 @@ func TestMsgLength(t *testing.T) {
makeMsg(name1, []RR{rrMx, rrMx}, nil, nil)} makeMsg(name1, []RR{rrMx, rrMx}, nil, nil)}
for _, msg := range tests { for _, msg := range tests {
predicted := msg.Len() - 1 // Because we add one in Len() predicted := msg.Len()
buf, err := msg.Pack() buf, err := msg.Pack()
if err != nil { if err != nil {
t.Error(err) t.Error(err)
t.Fail() t.Fail()
} }
if predicted != len(buf) { if predicted < len(buf) {
t.Errorf("Predicted length is wrong: predicted %s (len=%d) %d, actual %d\n", t.Errorf("Predicted length is wrong: predicted %s (len=%d), actual %d\n",
msg.Question[0].Name, predicted, len(buf)) msg.Question[0].Name, predicted, len(buf))
t.Fail() t.Fail()
} }
@ -298,6 +298,7 @@ func TestMsgLength2(t *testing.T) {
input, _ := hex.DecodeString(hexData) input, _ := hex.DecodeString(hexData)
m := new(Msg) m := new(Msg)
m.Unpack(input) m.Unpack(input)
//println(m.String())
m.Compress = true m.Compress = true
lenComp := m.Len() lenComp := m.Len()
b, _ := m.Pack() b, _ := m.Pack()
@ -306,10 +307,10 @@ func TestMsgLength2(t *testing.T) {
lenUnComp := m.Len() lenUnComp := m.Len()
b, _ = m.Pack() b, _ = m.Pack()
pacUnComp := len(b) pacUnComp := len(b)
if pacComp != lenComp { if pacComp+1 != lenComp {
t.Errorf("msg.Len(compressed)=%d actual=%d for test %d", lenComp, pacComp, i) t.Errorf("msg.Len(compressed)=%d actual=%d for test %d", lenComp, pacComp, i)
} }
if pacUnComp != lenUnComp { if pacUnComp+1 != lenUnComp {
t.Errorf("msg.Len(uncompressed)=%d actual=%d for test %d", lenUnComp, pacUnComp, i) t.Errorf("msg.Len(uncompressed)=%d actual=%d for test %d", lenUnComp, pacUnComp, i)
} }
} }

2
msg.go
View File

@ -1581,7 +1581,7 @@ func (dns *Msg) Len() int {
compressionLenHelperType(compression, dns.Extra[i]) compressionLenHelperType(compression, dns.Extra[i])
} }
} }
return l+1 return l
} }
// Put the parts of the name in the compression map. // Put the parts of the name in the compression map.

View File

@ -185,7 +185,7 @@ func (q *Question) String() (s string) {
} }
func (q *Question) len() int { func (q *Question) len() int {
l := dLen(q.Name) l := len(q.Name) + 1
return l + 4 return l + 4
} }
@ -207,7 +207,7 @@ type CNAME struct {
func (rr *CNAME) Header() *RR_Header { return &rr.Hdr } func (rr *CNAME) Header() *RR_Header { return &rr.Hdr }
func (rr *CNAME) copy() RR { return &CNAME{*rr.Hdr.copyHeader(), rr.Target} } func (rr *CNAME) copy() RR { return &CNAME{*rr.Hdr.copyHeader(), rr.Target} }
func (rr *CNAME) String() string { return rr.Hdr.String() + rr.Target } func (rr *CNAME) String() string { return rr.Hdr.String() + rr.Target }
func (rr *CNAME) len() int { return rr.Hdr.len() + dLen(rr.Target) } func (rr *CNAME) len() int { return rr.Hdr.len() + len(rr.Target) + 1 }
type HINFO struct { type HINFO struct {
Hdr RR_Header Hdr RR_Header
@ -229,7 +229,7 @@ func (rr *MB) Header() *RR_Header { return &rr.Hdr }
func (rr *MB) copy() RR { return &MB{*rr.Hdr.copyHeader(), rr.Mb} } func (rr *MB) copy() RR { return &MB{*rr.Hdr.copyHeader(), rr.Mb} }
func (rr *MB) String() string { return rr.Hdr.String() + rr.Mb } func (rr *MB) String() string { return rr.Hdr.String() + rr.Mb }
func (rr *MB) len() int { return rr.Hdr.len() + dLen(rr.Mb) } func (rr *MB) len() int { return rr.Hdr.len() + len(rr.Mb) + 1 }
type MG struct { type MG struct {
Hdr RR_Header Hdr RR_Header
@ -238,7 +238,7 @@ type MG struct {
func (rr *MG) Header() *RR_Header { return &rr.Hdr } func (rr *MG) Header() *RR_Header { return &rr.Hdr }
func (rr *MG) copy() RR { return &MG{*rr.Hdr.copyHeader(), rr.Mg} } func (rr *MG) copy() RR { return &MG{*rr.Hdr.copyHeader(), rr.Mg} }
func (rr *MG) len() int { l := dLen(rr.Mg); return rr.Hdr.len() + l } func (rr *MG) len() int { l := len(rr.Mg) + 1; return rr.Hdr.len() + l }
func (rr *MG) String() string { return rr.Hdr.String() + rr.Mg } func (rr *MG) String() string { return rr.Hdr.String() + rr.Mg }
type MINFO struct { type MINFO struct {
@ -255,8 +255,8 @@ func (rr *MINFO) String() string {
} }
func (rr *MINFO) len() int { func (rr *MINFO) len() int {
l := dLen(rr.Rmail) l := len(rr.Rmail) + 1
n := dLen(rr.Email) n := len(rr.Email) + 1
return rr.Hdr.len() + l + n return rr.Hdr.len() + l + n
} }
@ -267,7 +267,7 @@ type MR struct {
func (rr *MR) Header() *RR_Header { return &rr.Hdr } func (rr *MR) Header() *RR_Header { return &rr.Hdr }
func (rr *MR) copy() RR { return &MR{*rr.Hdr.copyHeader(), rr.Mr} } func (rr *MR) copy() RR { return &MR{*rr.Hdr.copyHeader(), rr.Mr} }
func (rr *MR) len() int { l := dLen(rr.Mr); return rr.Hdr.len() + l } func (rr *MR) len() int { l := len(rr.Mr) + 1; return rr.Hdr.len() + l }
func (rr *MR) String() string { func (rr *MR) String() string {
return rr.Hdr.String() + rr.Mr return rr.Hdr.String() + rr.Mr
@ -280,7 +280,7 @@ type MF struct {
func (rr *MF) Header() *RR_Header { return &rr.Hdr } func (rr *MF) Header() *RR_Header { return &rr.Hdr }
func (rr *MF) copy() RR { return &MF{*rr.Hdr.copyHeader(), rr.Mf} } func (rr *MF) copy() RR { return &MF{*rr.Hdr.copyHeader(), rr.Mf} }
func (rr *MF) len() int { return rr.Hdr.len() + dLen(rr.Mf) } func (rr *MF) len() int { return rr.Hdr.len() + len(rr.Mf) + 1 }
func (rr *MF) String() string { func (rr *MF) String() string {
return rr.Hdr.String() + " " + rr.Mf return rr.Hdr.String() + " " + rr.Mf
@ -293,7 +293,7 @@ type MD struct {
func (rr *MD) Header() *RR_Header { return &rr.Hdr } func (rr *MD) Header() *RR_Header { return &rr.Hdr }
func (rr *MD) copy() RR { return &MD{*rr.Hdr.copyHeader(), rr.Md} } func (rr *MD) copy() RR { return &MD{*rr.Hdr.copyHeader(), rr.Md} }
func (rr *MD) len() int { return rr.Hdr.len() +dLen(rr.Md) } func (rr *MD) len() int { return rr.Hdr.len() + len(rr.Md) + 1 }
func (rr *MD) String() string { func (rr *MD) String() string {
return rr.Hdr.String() + " " + rr.Md return rr.Hdr.String() + " " + rr.Md
@ -307,7 +307,7 @@ type MX struct {
func (rr *MX) Header() *RR_Header { return &rr.Hdr } func (rr *MX) Header() *RR_Header { return &rr.Hdr }
func (rr *MX) copy() RR { return &MX{*rr.Hdr.copyHeader(), rr.Preference, rr.Mx} } func (rr *MX) copy() RR { return &MX{*rr.Hdr.copyHeader(), rr.Preference, rr.Mx} }
func (rr *MX) len() int { l := dLen(rr.Mx); return rr.Hdr.len() + l + 2 } func (rr *MX) len() int { l := len(rr.Mx) + 1; return rr.Hdr.len() + l + 2 }
func (rr *MX) String() string { func (rr *MX) String() string {
return rr.Hdr.String() + strconv.Itoa(int(rr.Preference)) + " " + rr.Mx return rr.Hdr.String() + strconv.Itoa(int(rr.Preference)) + " " + rr.Mx
@ -321,7 +321,7 @@ type AFSDB struct {
func (rr *AFSDB) Header() *RR_Header { return &rr.Hdr } func (rr *AFSDB) Header() *RR_Header { return &rr.Hdr }
func (rr *AFSDB) copy() RR { return &AFSDB{*rr.Hdr.copyHeader(), rr.Subtype, rr.Hostname} } func (rr *AFSDB) copy() RR { return &AFSDB{*rr.Hdr.copyHeader(), rr.Subtype, rr.Hostname} }
func (rr *AFSDB) len() int { l := dLen(rr.Hostname); return rr.Hdr.len() + l + 2 } func (rr *AFSDB) len() int { l := len(rr.Hostname) + 1; return rr.Hdr.len() + l + 2 }
func (rr *AFSDB) String() string { func (rr *AFSDB) String() string {
return rr.Hdr.String() + strconv.Itoa(int(rr.Subtype)) + " " + rr.Hostname return rr.Hdr.String() + strconv.Itoa(int(rr.Subtype)) + " " + rr.Hostname
@ -348,7 +348,7 @@ type RT struct {
func (rr *RT) Header() *RR_Header { return &rr.Hdr } func (rr *RT) Header() *RR_Header { return &rr.Hdr }
func (rr *RT) copy() RR { return &RT{*rr.Hdr.copyHeader(), rr.Preference, rr.Host} } func (rr *RT) copy() RR { return &RT{*rr.Hdr.copyHeader(), rr.Preference, rr.Host} }
func (rr *RT) len() int { l := dLen(rr.Host); return rr.Hdr.len() + l + 2 } func (rr *RT) len() int { l := len(rr.Host) + 1; return rr.Hdr.len() + l + 2 }
func (rr *RT) String() string { func (rr *RT) String() string {
return rr.Hdr.String() + strconv.Itoa(int(rr.Preference)) + " " + rr.Host return rr.Hdr.String() + strconv.Itoa(int(rr.Preference)) + " " + rr.Host
@ -360,7 +360,7 @@ type NS struct {
} }
func (rr *NS) Header() *RR_Header { return &rr.Hdr } func (rr *NS) Header() *RR_Header { return &rr.Hdr }
func (rr *NS) len() int { l := dLen(rr.Ns); return rr.Hdr.len() + l } func (rr *NS) len() int { l := len(rr.Ns) + 1; return rr.Hdr.len() + l }
func (rr *NS) copy() RR { return &NS{*rr.Hdr.copyHeader(), rr.Ns} } func (rr *NS) copy() RR { return &NS{*rr.Hdr.copyHeader(), rr.Ns} }
func (rr *NS) String() string { func (rr *NS) String() string {
@ -374,7 +374,7 @@ type PTR struct {
func (rr *PTR) Header() *RR_Header { return &rr.Hdr } func (rr *PTR) Header() *RR_Header { return &rr.Hdr }
func (rr *PTR) copy() RR { return &PTR{*rr.Hdr.copyHeader(), rr.Ptr} } func (rr *PTR) copy() RR { return &PTR{*rr.Hdr.copyHeader(), rr.Ptr} }
func (rr *PTR) len() int { l := dLen(rr.Ptr); return rr.Hdr.len() + l } func (rr *PTR) len() int { l := len(rr.Ptr) + 1; return rr.Hdr.len() + l }
func (rr *PTR) String() string { func (rr *PTR) String() string {
return rr.Hdr.String() + rr.Ptr return rr.Hdr.String() + rr.Ptr
@ -388,7 +388,7 @@ type RP struct {
func (rr *RP) Header() *RR_Header { return &rr.Hdr } func (rr *RP) Header() *RR_Header { return &rr.Hdr }
func (rr *RP) copy() RR { return &RP{*rr.Hdr.copyHeader(), rr.Mbox, rr.Txt} } func (rr *RP) copy() RR { return &RP{*rr.Hdr.copyHeader(), rr.Mbox, rr.Txt} }
func (rr *RP) len() int { return rr.Hdr.len() + dLen(rr.Mbox) + dLen(rr.Txt) } func (rr *RP) len() int { return rr.Hdr.len() + len(rr.Mbox) + 1 + len(rr.Txt) + 1 }
func (rr *RP) String() string { func (rr *RP) String() string {
return rr.Hdr.String() + rr.Mbox + " " + rr.Txt return rr.Hdr.String() + rr.Mbox + " " + rr.Txt
@ -420,8 +420,8 @@ func (rr *SOA) String() string {
} }
func (rr *SOA) len() int { func (rr *SOA) len() int {
l := dLen(rr.Ns) l := len(rr.Ns) + 1
n := dLen(rr.Mbox) n := len(rr.Mbox) + 1
return rr.Hdr.len() + l + n + 20 return rr.Hdr.len() + l + n + 20
} }
@ -498,7 +498,7 @@ type SRV struct {
} }
func (rr *SRV) Header() *RR_Header { return &rr.Hdr } func (rr *SRV) Header() *RR_Header { return &rr.Hdr }
func (rr *SRV) len() int { l := dLen(rr.Target); return rr.Hdr.len() + l + 6 } func (rr *SRV) len() int { l := len(rr.Target) + 1; return rr.Hdr.len() + l + 6 }
func (rr *SRV) copy() RR { func (rr *SRV) copy() RR {
return &SRV{*rr.Hdr.copyHeader(), rr.Priority, rr.Weight, rr.Port, rr.Target} return &SRV{*rr.Hdr.copyHeader(), rr.Priority, rr.Weight, rr.Port, rr.Target}
} }
@ -537,7 +537,7 @@ func (rr *NAPTR) String() string {
func (rr *NAPTR) len() int { func (rr *NAPTR) len() int {
return rr.Hdr.len() + 4 + len(rr.Flags) + 1 + len(rr.Service) + 1 + return rr.Hdr.len() + 4 + len(rr.Flags) + 1 + len(rr.Service) + 1 +
len(rr.Regexp) + 1 + dLen(rr.Replacement) len(rr.Regexp) + 1 + len(rr.Replacement) + 1
} }
// See RFC 4398. // See RFC 4398.
@ -574,7 +574,7 @@ type DNAME struct {
func (rr *DNAME) Header() *RR_Header { return &rr.Hdr } func (rr *DNAME) Header() *RR_Header { return &rr.Hdr }
func (rr *DNAME) copy() RR { return &DNAME{*rr.Hdr.copyHeader(), rr.Target} } func (rr *DNAME) copy() RR { return &DNAME{*rr.Hdr.copyHeader(), rr.Target} }
func (rr *DNAME) len() int { l := dLen(rr.Target); return rr.Hdr.len() + l } func (rr *DNAME) len() int { l := len(rr.Target) + 1; return rr.Hdr.len() + l }
func (rr *DNAME) String() string { func (rr *DNAME) String() string {
return rr.Hdr.String() + rr.Target return rr.Hdr.String() + rr.Target
@ -624,7 +624,7 @@ func (rr *PX) copy() RR { return &PX{*rr.Hdr.copyHeader(), rr.Preferen
func (rr *PX) String() string { func (rr *PX) String() string {
return rr.Hdr.String() + strconv.Itoa(int(rr.Preference)) + " " + rr.Map822 + " " + rr.Mapx400 return rr.Hdr.String() + strconv.Itoa(int(rr.Preference)) + " " + rr.Map822 + " " + rr.Mapx400
} }
func (rr *PX) len() int { return rr.Hdr.len() + 2 + dLen(rr.Map822) + dLen(rr.Mapx400) } func (rr *PX) len() int { return rr.Hdr.len() + 2 + len(rr.Map822) + 1 + len(rr.Mapx400) + 1 }
type GPOS struct { type GPOS struct {
Hdr RR_Header Hdr RR_Header
@ -737,7 +737,7 @@ func (rr *RRSIG) String() string {
} }
func (rr *RRSIG) len() int { func (rr *RRSIG) len() int {
return rr.Hdr.len() + dLen(rr.SignerName) + return rr.Hdr.len() + len(rr.SignerName) + 1 +
base64.StdEncoding.DecodedLen(len(rr.Signature)) + 18 base64.StdEncoding.DecodedLen(len(rr.Signature)) + 18
} }
@ -763,7 +763,7 @@ func (rr *NSEC) String() string {
} }
func (rr *NSEC) len() int { func (rr *NSEC) len() int {
l := rr.Hdr.len() + dLen(rr.NextDomain) l := rr.Hdr.len() + len(rr.NextDomain) + 1
lastwindow := uint32(2 ^ 32 + 1) lastwindow := uint32(2 ^ 32 + 1)
for _, t := range rr.TypeBitMap { for _, t := range rr.TypeBitMap {
window := t / 256 window := t / 256
@ -845,7 +845,7 @@ type KX struct {
} }
func (rr *KX) Header() *RR_Header { return &rr.Hdr } func (rr *KX) Header() *RR_Header { return &rr.Hdr }
func (rr *KX) len() int { return rr.Hdr.len() + 2 + dLen(rr.Exchanger) } func (rr *KX) len() int { return rr.Hdr.len() + 2 + len(rr.Exchanger) + 1 }
func (rr *KX) copy() RR { return &KX{*rr.Hdr.copyHeader(), rr.Preference, rr.Exchanger} } func (rr *KX) copy() RR { return &KX{*rr.Hdr.copyHeader(), rr.Preference, rr.Exchanger} }
func (rr *KX) String() string { func (rr *KX) String() string {
@ -882,7 +882,7 @@ type TALINK struct {
func (rr *TALINK) Header() *RR_Header { return &rr.Hdr } func (rr *TALINK) Header() *RR_Header { return &rr.Hdr }
func (rr *TALINK) copy() RR { return &TALINK{*rr.Hdr.copyHeader(), rr.PreviousName, rr.NextName} } func (rr *TALINK) copy() RR { return &TALINK{*rr.Hdr.copyHeader(), rr.PreviousName, rr.NextName} }
func (rr *TALINK) len() int { return rr.Hdr.len() + dLen(rr.PreviousName) + dLen(rr.NextName) } func (rr *TALINK) len() int { return rr.Hdr.len() + len(rr.PreviousName) + len(rr.NextName) + 2 }
func (rr *TALINK) String() string { func (rr *TALINK) String() string {
return rr.Hdr.String() + return rr.Hdr.String() +
@ -998,7 +998,7 @@ type NSAPPTR struct {
func (rr *NSAPPTR) Header() *RR_Header { return &rr.Hdr } func (rr *NSAPPTR) Header() *RR_Header { return &rr.Hdr }
func (rr *NSAPPTR) copy() RR { return &NSAPPTR{*rr.Hdr.copyHeader(), rr.Ptr} } func (rr *NSAPPTR) copy() RR { return &NSAPPTR{*rr.Hdr.copyHeader(), rr.Ptr} }
func (rr *NSAPPTR) String() string { return rr.Hdr.String() + rr.Ptr } func (rr *NSAPPTR) String() string { return rr.Hdr.String() + rr.Ptr }
func (rr *NSAPPTR) len() int { return rr.Hdr.len() + dLen(rr.Ptr) } func (rr *NSAPPTR) len() int { return rr.Hdr.len() + len(rr.Ptr) }
type NSEC3 struct { type NSEC3 struct {
Hdr RR_Header Hdr RR_Header
@ -1093,7 +1093,7 @@ func (rr *TKEY) String() string {
} }
func (rr *TKEY) len() int { func (rr *TKEY) len() int {
return rr.Hdr.len() + dLen(rr.Algorithm) + 4 + 4 + 6 + return rr.Hdr.len() + len(rr.Algorithm) + 1 + 4 + 4 + 6 +
len(rr.Key) + 2 + len(rr.OtherData) len(rr.Key) + 2 + len(rr.OtherData)
} }
@ -1214,7 +1214,7 @@ func (rr *HIP) len() int {
len(rr.Hit)/2 + len(rr.Hit)/2 +
base64.StdEncoding.DecodedLen(len(rr.PublicKey)) base64.StdEncoding.DecodedLen(len(rr.PublicKey))
for _, d := range rr.RendezvousServers { for _, d := range rr.RendezvousServers {
l += dLen(d) l += len(d) + 1
} }
return l return l
} }
@ -1339,7 +1339,7 @@ type LP struct {
func (rr *LP) Header() *RR_Header { return &rr.Hdr } func (rr *LP) Header() *RR_Header { return &rr.Hdr }
func (rr *LP) copy() RR { return &LP{*rr.Hdr.copyHeader(), rr.Preference, rr.Fqdn} } func (rr *LP) copy() RR { return &LP{*rr.Hdr.copyHeader(), rr.Preference, rr.Fqdn} }
func (rr *LP) len() int { return rr.Hdr.len() + 2 + dLen(rr.Fqdn) } func (rr *LP) len() int { return rr.Hdr.len() + 2 + len(rr.Fqdn) + 1 }
func (rr *LP) String() string { func (rr *LP) String() string {
return rr.Hdr.String() + strconv.Itoa(int(rr.Preference)) + " " + rr.Fqdn return rr.Hdr.String() + strconv.Itoa(int(rr.Preference)) + " " + rr.Fqdn
@ -1509,16 +1509,6 @@ func copyIP(ip net.IP) net.IP {
return p return p
} }
// dLen returns the length of a domain name. It returns 0 for the root zone.
// We are using the text here, but all other mechanisms allowed in the text
// representation of dname only make this name longer.
func dLen(s string) int {
if s == "." {
return 0
}
return len(s) + 1
}
// Map of constructors for each RR wire type. // Map of constructors for each RR wire type.
var rr_mk = map[uint16]func() RR{ var rr_mk = map[uint16]func() RR{
TypeA: func() RR { return new(A) }, TypeA: func() RR { return new(A) },