From 799de7044d952a26f7def1dac9e87ff42aa0ea79 Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Sun, 5 Jun 2016 08:23:44 +0100 Subject: [PATCH] Remove WKS support Support for WKS was incomplete, i.e. len() method was incorrect. Remove support for the record and handle it as an unknown one. Fixes #361 --- dns_test.go | 3 +-- format.go | 9 -------- msg.go | 58 ---------------------------------------------- msg_generate.go | 3 +-- scan_rr.go | 59 ----------------------------------------------- types.go | 26 --------------------- types_generate.go | 5 ++-- zmsg.go | 46 ------------------------------------ ztypes.go | 8 ------- 9 files changed, 4 insertions(+), 213 deletions(-) diff --git a/dns_test.go b/dns_test.go index a709cce0..34007aa8 100644 --- a/dns_test.go +++ b/dns_test.go @@ -334,9 +334,8 @@ func TestNoRdataPack(t *testing.T) { func TestNoRdataUnpack(t *testing.T) { data := make([]byte, 1024) for typ, fn := range TypeToRR { - if typ == TypeSOA || typ == TypeTSIG || typ == TypeWKS { + if typ == TypeSOA || typ == TypeTSIG { // SOA, TSIG will not be seen (like this) in dyn. updates? - // WKS is an bug, but...deprecated record. continue } r := fn() diff --git a/format.go b/format.go index 1ac1664f..3f5303c2 100644 --- a/format.go +++ b/format.go @@ -69,15 +69,6 @@ func Field(r RR, i int) string { s += " " + Type(d.Index(i).Uint()).String() } return s - case `dns:"wks"`: - if d.Len() == 0 { - return "" - } - s := strconv.Itoa(int(d.Index(0).Uint())) - for i := 0; i < d.Len(); i++ { - s += " " + strconv.Itoa(int(d.Index(i).Uint())) - } - return s default: // if it does not have a tag its a string slice fallthrough diff --git a/msg.go b/msg.go index 1a10d54a..79b40f29 100644 --- a/msg.go +++ b/msg.go @@ -663,26 +663,6 @@ func packStructValue(val reflect.Value, msg []byte, off int, compression map[str msg[off] = byte(fv.Index(j).Uint()) off++ } - case `dns:"wks"`: - // TODO(miek): this is wrong should be lenrd - if off == lenmsg { - break // dyn. updates - } - if val.Field(i).Len() == 0 { - break - } - off1 := off - for j := 0; j < val.Field(i).Len(); j++ { - serv := int(fv.Index(j).Uint()) - if off+serv/8+1 > len(msg) { - return len(msg), &Error{err: "overflow packing wks"} - } - msg[off+serv/8] |= byte(1 << (7 - uint(serv%8))) - if off+serv/8+1 > off1 { - off1 = off + serv/8 + 1 - } - } - off = off1 case `dns:"nsec"`: // NSEC/NSEC3 // This is the uint16 type bitmap if val.Field(i).Len() == 0 { @@ -1050,44 +1030,6 @@ func unpackStructValue(val reflect.Value, msg []byte, off int) (off1 int, err er msg[off+5], msg[off+6], msg[off+7], msg[off+8], msg[off+9], msg[off+10], msg[off+11], msg[off+12], msg[off+13], msg[off+14], msg[off+15]})) off += net.IPv6len - case `dns:"wks"`: - // Rest of the record is the bitmap - var serv []uint16 - j := 0 - for off < lenmsg { - if off+1 > lenmsg { - return lenmsg, &Error{err: "overflow unpacking wks"} - } - b := msg[off] - // Check the bits one by one, and set the type - if b&0x80 == 0x80 { - serv = append(serv, uint16(j*8+0)) - } - if b&0x40 == 0x40 { - serv = append(serv, uint16(j*8+1)) - } - if b&0x20 == 0x20 { - serv = append(serv, uint16(j*8+2)) - } - if b&0x10 == 0x10 { - serv = append(serv, uint16(j*8+3)) - } - if b&0x8 == 0x8 { - serv = append(serv, uint16(j*8+4)) - } - if b&0x4 == 0x4 { - serv = append(serv, uint16(j*8+5)) - } - if b&0x2 == 0x2 { - serv = append(serv, uint16(j*8+6)) - } - if b&0x1 == 0x1 { - serv = append(serv, uint16(j*8+7)) - } - j++ - off++ - } - fv.Set(reflect.ValueOf(serv)) case `dns:"nsec"`: // NSEC/NSEC3 if off == len(msg) { break diff --git a/msg_generate.go b/msg_generate.go index 4daf921b..9076bfc1 100644 --- a/msg_generate.go +++ b/msg_generate.go @@ -25,7 +25,6 @@ import ( // * OPT RR - EDNS0 parsing - needs to some looking at // * HIP - uses "hex", but is actually size-hex - might drop size-hex? // * Z -// * WKS - uint16 slice // * NINFO // * PrivateRR @@ -73,7 +72,7 @@ func main() { if st, _ := getTypeStruct(o.Type(), scope); st == nil { continue } - if name == "PrivateRR" { + if name == "PrivateRR" || name == "WKS" { continue } diff --git a/scan_rr.go b/scan_rr.go index ead9614d..8092e0ee 100644 --- a/scan_rr.go +++ b/scan_rr.go @@ -1443,64 +1443,6 @@ func setEUI64(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { return rr, nil, "" } -func setWKS(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { - rr := new(WKS) - rr.Hdr = h - - l := <-c - if l.length == 0 { - return rr, nil, l.comment - } - rr.Address = net.ParseIP(l.token) - if rr.Address == nil || l.err { - return nil, &ParseError{f, "bad WKS Address", l}, "" - } - - <-c // zBlank - l = <-c - proto := "tcp" - i, e := strconv.Atoi(l.token) - if e != nil || l.err { - return nil, &ParseError{f, "bad WKS Protocol", l}, "" - } - rr.Protocol = uint8(i) - switch rr.Protocol { - case 17: - proto = "udp" - case 6: - proto = "tcp" - default: - return nil, &ParseError{f, "bad WKS Protocol", l}, "" - } - - <-c - l = <-c - rr.BitMap = make([]uint16, 0) - var ( - k int - err error - ) - for l.value != zNewline && l.value != zEOF { - switch l.value { - case zBlank: - // Ok - case zString: - if k, err = net.LookupPort(proto, l.token); err != nil { - i, e := strconv.Atoi(l.token) // If a number use that - if e != nil { - return nil, &ParseError{f, "bad WKS BitMap", l}, "" - } - rr.BitMap = append(rr.BitMap, uint16(i)) - } - rr.BitMap = append(rr.BitMap, uint16(k)) - default: - return nil, &ParseError{f, "bad WKS BitMap", l}, "" - } - l = <-c - } - return rr, nil, l.comment -} - func setSSHFP(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { rr := new(SSHFP) rr.Hdr = h @@ -2265,6 +2207,5 @@ var typeToparserFunc = map[uint16]parserFunc{ TypeUID: {setUID, false}, TypeUINFO: {setUINFO, true}, TypeURI: {setURI, true}, - TypeWKS: {setWKS, true}, TypeX25: {setX25, false}, } diff --git a/types.go b/types.go index 64143dba..05247255 100644 --- a/types.go +++ b/types.go @@ -35,7 +35,6 @@ const ( TypeMG uint16 = 8 TypeMR uint16 = 9 TypeNULL uint16 = 10 - TypeWKS uint16 = 11 TypePTR uint16 = 12 TypeHINFO uint16 = 13 TypeMINFO uint16 = 14 @@ -1128,31 +1127,6 @@ type NINFO struct { func (rr *NINFO) String() string { return rr.Hdr.String() + sprintTxt(rr.ZSData) } -type WKS struct { - Hdr RR_Header - Address net.IP `dns:"a"` - Protocol uint8 - BitMap []uint16 `dns:"wks"` -} - -func (rr *WKS) len() int { - // TODO: this is missing something... - return rr.Hdr.len() + net.IPv4len + 1 -} - -func (rr *WKS) String() (s string) { - s = rr.Hdr.String() - if rr.Address != nil { - s += rr.Address.String() - } - // TODO(miek): missing protocol here, see /etc/protocols - for i := 0; i < len(rr.BitMap); i++ { - // should lookup the port - s += " " + strconv.Itoa(int(rr.BitMap[i])) - } - return s -} - type NID struct { Hdr RR_Header Preference uint16 diff --git a/types_generate.go b/types_generate.go index 4df136ef..35428533 100644 --- a/types_generate.go +++ b/types_generate.go @@ -23,7 +23,6 @@ var skipLen = map[string]struct{}{ "NSEC": {}, "NSEC3": {}, "OPT": {}, - "WKS": {}, "IPSECKEY": {}, } @@ -105,7 +104,7 @@ func main() { continue } name := strings.TrimPrefix(o.Name(), "Type") - if name == "PrivateRR" { + if name == "PrivateRR" || name == "WKS" { continue } numberedTypes = append(numberedTypes, name) @@ -121,7 +120,7 @@ func main() { if st, _ := getTypeStruct(o.Type(), scope); st == nil { continue } - if name == "PrivateRR" { + if name == "PrivateRR" || name == "WKS" { continue } diff --git a/zmsg.go b/zmsg.go index bfe49c7b..fad3b569 100644 --- a/zmsg.go +++ b/zmsg.go @@ -1221,24 +1221,6 @@ func (rr *URI) pack(msg []byte, off int, compression map[string]int, compress bo return off, nil } -func (rr *WKS) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) { - off, err := rr.Hdr.pack(msg, off, compression, compress) - if err != nil { - return off, err - } - headerEnd := off - off, err = packDataA(rr.Address, msg, off) - if err != nil { - return off, err - } - off, err = packUint8(rr.Protocol, msg, off) - if err != nil { - return off, err - } - rr.Header().Rdlength = uint16(off - headerEnd) - return off, nil -} - func (rr *X25) pack(msg []byte, off int, compression map[string]int, compress bool) (int, error) { off, err := rr.Hdr.pack(msg, off, compression, compress) if err != nil { @@ -3040,34 +3022,6 @@ func unpackURI(h RR_Header, msg []byte, off int) (RR, int, error) { return rr, off, err } -func unpackWKS(h RR_Header, msg []byte, off int) (RR, int, error) { - if noRdata(h) { - return nil, off, nil - } - var err error - rdStart := off - _ = rdStart - - rr := new(WKS) - rr.Hdr = h - - rr.Address, off, err = unpackDataA(msg, off) - if err != nil { - return rr, off, err - } - if off == len(msg) { - return rr, off, nil - } - rr.Protocol, off, err = unpackUint8(msg, off) - if err != nil { - return rr, off, err - } - if off == len(msg) { - return rr, off, nil - } - return rr, off, err -} - func unpackX25(h RR_Header, msg []byte, off int) (RR, int, error) { if noRdata(h) { return nil, off, nil diff --git a/ztypes.go b/ztypes.go index 858272bc..a9b4beef 100644 --- a/ztypes.go +++ b/ztypes.go @@ -76,7 +76,6 @@ var TypeToRR = map[uint16]func() RR{ TypeUID: func() RR { return new(UID) }, TypeUINFO: func() RR { return new(UINFO) }, TypeURI: func() RR { return new(URI) }, - TypeWKS: func() RR { return new(WKS) }, TypeX25: func() RR { return new(X25) }, } @@ -158,7 +157,6 @@ var TypeToString = map[uint16]string{ TypeUINFO: "UINFO", TypeUNSPEC: "UNSPEC", TypeURI: "URI", - TypeWKS: "WKS", TypeX25: "X25", TypeNSAPPTR: "NSAP-PTR", } @@ -231,7 +229,6 @@ func (rr *TXT) Header() *RR_Header { return &rr.Hdr } func (rr *UID) Header() *RR_Header { return &rr.Hdr } func (rr *UINFO) Header() *RR_Header { return &rr.Hdr } func (rr *URI) Header() *RR_Header { return &rr.Hdr } -func (rr *WKS) Header() *RR_Header { return &rr.Hdr } func (rr *X25) Header() *RR_Header { return &rr.Hdr } // len() functions @@ -832,11 +829,6 @@ func (rr *UINFO) copy() RR { func (rr *URI) copy() RR { return &URI{*rr.Hdr.copyHeader(), rr.Priority, rr.Weight, rr.Target} } -func (rr *WKS) copy() RR { - BitMap := make([]uint16, len(rr.BitMap)) - copy(BitMap, rr.BitMap) - return &WKS{*rr.Hdr.copyHeader(), copyIP(rr.Address), rr.Protocol, BitMap} -} func (rr *X25) copy() RR { return &X25{*rr.Hdr.copyHeader(), rr.PSDNAddress} }