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 {
l := dLen(h.Name)
l := len(h.Name) + 1
l += 10 // rrtype(2) + class(2) + ttl(4) + rdlength(2)
return l
}

View File

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

2
msg.go
View File

@ -1581,7 +1581,7 @@ func (dns *Msg) Len() int {
compressionLenHelperType(compression, dns.Extra[i])
}
}
return l+1
return l
}
// 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 {
l := dLen(q.Name)
l := len(q.Name) + 1
return l + 4
}
@ -207,7 +207,7 @@ type CNAME struct {
func (rr *CNAME) Header() *RR_Header { return &rr.Hdr }
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) 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 {
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) 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 {
Hdr RR_Header
@ -238,7 +238,7 @@ type MG struct {
func (rr *MG) Header() *RR_Header { return &rr.Hdr }
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 }
type MINFO struct {
@ -255,8 +255,8 @@ func (rr *MINFO) String() string {
}
func (rr *MINFO) len() int {
l := dLen(rr.Rmail)
n := dLen(rr.Email)
l := len(rr.Rmail) + 1
n := len(rr.Email) + 1
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) 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 {
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) 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 {
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) 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 {
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) 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 {
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) 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 {
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) 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 {
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) 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) String() string {
@ -374,7 +374,7 @@ type PTR struct {
func (rr *PTR) Header() *RR_Header { return &rr.Hdr }
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 {
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) 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 {
return rr.Hdr.String() + rr.Mbox + " " + rr.Txt
@ -420,8 +420,8 @@ func (rr *SOA) String() string {
}
func (rr *SOA) len() int {
l := dLen(rr.Ns)
n := dLen(rr.Mbox)
l := len(rr.Ns) + 1
n := len(rr.Mbox) + 1
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) 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 {
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 {
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.
@ -574,7 +574,7 @@ type DNAME struct {
func (rr *DNAME) Header() *RR_Header { return &rr.Hdr }
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 {
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 {
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 {
Hdr RR_Header
@ -737,7 +737,7 @@ func (rr *RRSIG) String() string {
}
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
}
@ -763,7 +763,7 @@ func (rr *NSEC) String() string {
}
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)
for _, t := range rr.TypeBitMap {
window := t / 256
@ -845,7 +845,7 @@ type KX struct {
}
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) String() string {
@ -882,7 +882,7 @@ type TALINK struct {
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) 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 {
return rr.Hdr.String() +
@ -998,7 +998,7 @@ type NSAPPTR struct {
func (rr *NSAPPTR) Header() *RR_Header { return &rr.Hdr }
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) len() int { return rr.Hdr.len() + dLen(rr.Ptr) }
func (rr *NSAPPTR) len() int { return rr.Hdr.len() + len(rr.Ptr) }
type NSEC3 struct {
Hdr RR_Header
@ -1093,7 +1093,7 @@ func (rr *TKEY) String() string {
}
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)
}
@ -1214,7 +1214,7 @@ func (rr *HIP) len() int {
len(rr.Hit)/2 +
base64.StdEncoding.DecodedLen(len(rr.PublicKey))
for _, d := range rr.RendezvousServers {
l += dLen(d)
l += len(d) + 1
}
return l
}
@ -1339,7 +1339,7 @@ type LP struct {
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) 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 {
return rr.Hdr.String() + strconv.Itoa(int(rr.Preference)) + " " + rr.Fqdn
@ -1509,16 +1509,6 @@ func copyIP(ip net.IP) net.IP {
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.
var rr_mk = map[uint16]func() RR{
TypeA: func() RR { return new(A) },