diff --git a/README.md b/README.md index 8d5a2a4789..95bc08d5c3 100644 --- a/README.md +++ b/README.md @@ -82,9 +82,6 @@ A not-so-up-to-date-list-that-may-be-actually-current: * https://dnscheck.tools/ * https://github.com/egbakou/domainverifier * https://github.com/semihalev/sdns -* https://github.com/wintbiit/NineDNS -* https://linuxcontainers.org/incus/ -* https://ifconfig.es Send pull request if you want to be listed here. @@ -128,7 +125,6 @@ Example programs can be found in the `github.com/miekg/exdns` repository. *all of them* * 103{4,5} - DNS standard -* 1183 - ISDN, X25 and other deprecated records * 1348 - NSAP record (removed the record) * 1982 - Serial Arithmetic * 1876 - LOC record @@ -148,7 +144,6 @@ Example programs can be found in the `github.com/miekg/exdns` repository. * 3225 - DO bit (DNSSEC OK) * 340{1,2,3} - NAPTR record * 3445 - Limiting the scope of (DNS)KEY -* 3596 - AAAA record * 3597 - Unknown RRs * 4025 - A Method for Storing IPsec Keying Material in DNS * 403{3,4,5} - DNSSEC + validation functions @@ -189,9 +184,6 @@ Example programs can be found in the `github.com/miekg/exdns` repository. * 8777 - DNS Reverse IP Automatic Multicast Tunneling (AMT) Discovery * 8914 - Extended DNS Errors * 8976 - Message Digest for DNS Zones (ZONEMD RR) -* 9460 - Service Binding and Parameter Specification via the DNS -* 9461 - Service Binding Mapping for DNS Servers -* 9462 - Discovery of Designated Resolvers ## Loosely Based Upon diff --git a/acceptfunc_test.go b/acceptfunc_test.go index 868154d403..d40d4e4cd5 100644 --- a/acceptfunc_test.go +++ b/acceptfunc_test.go @@ -1,8 +1,6 @@ package dns import ( - "encoding/binary" - "net" "testing" ) @@ -35,86 +33,3 @@ func handleNotify(w ResponseWriter, req *Msg) { m.SetReply(req) w.WriteMsg(m) } - -func TestInvalidMsg(t *testing.T) { - HandleFunc("example.org.", func(ResponseWriter, *Msg) { - t.Fatal("the handler must not be called in any of these tests") - }) - s, addrstr, _, err := RunLocalTCPServer(":0") - if err != nil { - t.Fatalf("unable to run test server: %v", err) - } - defer s.Shutdown() - - s.MsgAcceptFunc = func(dh Header) MsgAcceptAction { - switch dh.Id { - case 0x0001: - return MsgAccept - case 0x0002: - return MsgReject - case 0x0003: - return MsgIgnore - case 0x0004: - return MsgRejectNotImplemented - default: - t.Errorf("unexpected ID %x", dh.Id) - return -1 - } - } - - invalidErrors := make(chan error) - s.MsgInvalidFunc = func(m []byte, err error) { - invalidErrors <- err - } - - c, err := net.Dial("tcp", addrstr) - if err != nil { - t.Fatalf("cannot connect to test server: %v", err) - } - - write := func(m []byte) { - var length [2]byte - binary.BigEndian.PutUint16(length[:], uint16(len(m))) - _, err := c.Write(length[:]) - if err != nil { - t.Fatalf("length write failed: %v", err) - } - _, err = c.Write(m) - if err != nil { - t.Fatalf("content write failed: %v", err) - } - } - - /* Message is too short, so there is no header to accept or reject. */ - - tooShortMessage := make([]byte, 11) - tooShortMessage[1] = 0x3 // ID = 3, would be ignored if it were parsable. - - write(tooShortMessage) - // Expect an error to be reported. - <-invalidErrors - - /* Message is accepted but is actually invalid. */ - - badMessage := make([]byte, 13) - badMessage[1] = 0x1 // ID = 1, Accept. - badMessage[5] = 1 // QDCOUNT = 1 - badMessage[12] = 99 // Bad question section. Invalid! - - write(badMessage) - // Expect an error to be reported. - <-invalidErrors - - /* Message is rejected before it can be determined to be invalid. */ - - close(invalidErrors) // A call to InvalidMsgFunc would panic due to the closed chan. - - badMessage[1] = 0x2 // ID = 2, Reject - write(badMessage) - - badMessage[1] = 0x3 // ID = 3, Ignore - write(badMessage) - - badMessage[1] = 0x4 // ID = 4, RejectNotImplemented - write(badMessage) -} diff --git a/defaults.go b/defaults.go index 68e766c689..02d9199a49 100644 --- a/defaults.go +++ b/defaults.go @@ -198,12 +198,10 @@ func IsDomainName(s string) (labels int, ok bool) { off int begin int wasDot bool - escape bool ) for i := 0; i < len(s); i++ { switch s[i] { case '\\': - escape = !escape if off+1 > lenmsg { return labels, false } @@ -219,7 +217,6 @@ func IsDomainName(s string) (labels int, ok bool) { wasDot = false case '.': - escape = false if i == 0 && len(s) > 1 { // leading dots are not legal except for the root zone return labels, false @@ -246,13 +243,10 @@ func IsDomainName(s string) (labels int, ok bool) { labels++ begin = i + 1 default: - escape = false wasDot = false } } - if escape { - return labels, false - } + return labels, true } diff --git a/dnssec_keyscan.go b/dnssec_keyscan.go index 9c9972db6e..5e72249b52 100644 --- a/dnssec_keyscan.go +++ b/dnssec_keyscan.go @@ -160,7 +160,7 @@ func parseKey(r io.Reader, file string) (map[string]string, error) { k = l.token case zValue: if k == "" { - return nil, &ParseError{file: file, err: "no private key seen", lex: l} + return nil, &ParseError{file, "no private key seen", l} } m[strings.ToLower(k)] = l.token diff --git a/generate.go b/generate.go index a81d2bc51f..713e9d2dad 100644 --- a/generate.go +++ b/generate.go @@ -116,7 +116,7 @@ func (r *generateReader) parseError(msg string, end int) *ParseError { l.token = r.s[r.si-1 : end] l.column += r.si // l.column starts one zBLANK before r.s - return &ParseError{file: r.file, err: msg, lex: l} + return &ParseError{r.file, msg, l} } func (r *generateReader) Read(p []byte) (int, error) { diff --git a/go.mod b/go.mod index 2f8e569b86..51010bba3a 100644 --- a/go.mod +++ b/go.mod @@ -3,10 +3,10 @@ module github.com/miekg/dns go 1.19 require ( - golang.org/x/net v0.26.0 - golang.org/x/sync v0.7.0 - golang.org/x/sys v0.21.0 - golang.org/x/tools v0.22.0 + golang.org/x/net v0.17.0 + golang.org/x/sync v0.4.0 + golang.org/x/sys v0.13.0 + golang.org/x/tools v0.13.0 ) -require golang.org/x/mod v0.18.0 // indirect +require golang.org/x/mod v0.12.0 // indirect diff --git a/go.sum b/go.sum index 1e3f4ba0b8..9bca0cb13b 100644 --- a/go.sum +++ b/go.sum @@ -1,10 +1,10 @@ -golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= -golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= -golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= -golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= -golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= diff --git a/listen_no_reuseport.go b/listen_no_reuseport.go index 8cebb2f171..848b8d022c 100644 --- a/listen_no_reuseport.go +++ b/listen_no_reuseport.go @@ -15,8 +15,6 @@ func listenTCP(network, addr string, reuseport, reuseaddr bool) (net.Listener, e return net.Listen(network, addr) } -const supportsReuseAddr = false - func listenUDP(network, addr string, reuseport, reuseaddr bool) (net.PacketConn, error) { if reuseport || reuseaddr { // TODO(tmthrgd): return an error? diff --git a/listen_reuseport.go b/listen_reuseport.go index 41326f20b7..0e73803d38 100644 --- a/listen_reuseport.go +++ b/listen_reuseport.go @@ -25,8 +25,6 @@ func reuseportControl(network, address string, c syscall.RawConn) error { return opErr } -const supportsReuseAddr = true - func reuseaddrControl(network, address string, c syscall.RawConn) error { var opErr error err := c.Control(func(fd uintptr) { @@ -39,7 +37,7 @@ func reuseaddrControl(network, address string, c syscall.RawConn) error { return opErr } -func listenTCP(network, addr string, reuseport, reuseaddr bool) (net.Listener, error) { +func listenTCP(network, addr string, reuseport bool, reuseaddr bool) (net.Listener, error) { var lc net.ListenConfig switch { case reuseaddr && reuseport: @@ -52,7 +50,7 @@ func listenTCP(network, addr string, reuseport, reuseaddr bool) (net.Listener, e return lc.Listen(context.Background(), network, addr) } -func listenUDP(network, addr string, reuseport, reuseaddr bool) (net.PacketConn, error) { +func listenUDP(network, addr string, reuseport bool, reuseaddr bool) (net.PacketConn, error) { var lc net.ListenConfig switch { case reuseaddr && reuseport: diff --git a/msg.go b/msg.go index 5fa7f9e833..8294d03958 100644 --- a/msg.go +++ b/msg.go @@ -714,7 +714,7 @@ func (h *MsgHdr) String() string { return s } -// Pack packs a Msg: it is converted to wire format. +// Pack packs a Msg: it is converted to to wire format. // If the dns.Compress is true the message will be in compressed wire format. func (dns *Msg) Pack() (msg []byte, err error) { return dns.PackBuffer(nil) diff --git a/parse_test.go b/parse_test.go index f0d68a44ec..0096e004d2 100644 --- a/parse_test.go +++ b/parse_test.go @@ -1098,41 +1098,18 @@ func TestTXT(t *testing.T) { } } - // Test TXT record with string larger than 255 bytes that should be split - // up by the parser. Add some escape sequences too to ensure their length - // is counted correctly. - s := `"\;\\\120` + strings.Repeat("a", 255) + `b"` - rr, err = NewRR(`test.local. 60 IN TXT ` + s) - if err != nil { - t.Error("failed to parse empty-string TXT record", err) - } - if rr.(*TXT).Txt[1] != "aaab" { - t.Errorf("Txt should have two strings, last one must be 'aaab', but is %s", rr.(*TXT).Txt[1]) + // Test TXT record with chunk larger than 255 bytes, they should be split up, by the parser + s := "" + for i := 0; i < 255; i++ { + s += "a" } - rrContent := strings.Replace(rr.String(), rr.Header().String(), "", 1) - expectedRRContent := `";\\x` + strings.Repeat("a", 252) + `" "aaab"` - if expectedRRContent != rrContent { - t.Errorf("Expected TXT RR content to be %#q but got %#q", expectedRRContent, rrContent) - } - - // Test TXT record that is already split up into strings of len <= 255. - s = fmt.Sprintf( - "%q %q %q %q %q %q", - strings.Repeat(`a`, 255), - strings.Repeat("b", 255), - strings.Repeat("c", 255), - strings.Repeat("d", 0), - strings.Repeat("e", 1), - strings.Repeat("f", 123), - ) - rr, err = NewRR(`test.local. 60 IN TXT ` + s) + s += "b" + rr, err = NewRR(`test.local. 60 IN TXT "` + s + `"`) if err != nil { t.Error("failed to parse empty-string TXT record", err) } - rrContent = strings.Replace(rr.String(), rr.Header().String(), "", 1) - expectedRRContent = s // same as input - if expectedRRContent != rrContent { - t.Errorf("Expected TXT RR content to be %#q but got %#q", expectedRRContent, rrContent) + if rr.(*TXT).Txt[1] != "b" { + t.Errorf("Txt should have two chunk, last one my be 'b', but is %s", rr.(*TXT).Txt[1]) } } @@ -1473,23 +1450,6 @@ func TestParseHINFO(t *testing.T) { } } -func TestParseISDN(t *testing.T) { - dt := map[string]string{ - "example.net. ISDN A B": "example.net. 3600 IN ISDN \"A\" \"B\"", - "example.net. ISDN \"A\" \"B\"": "example.net. 3600 IN ISDN \"A\" \"B\"", - } - for i, o := range dt { - rr, err := NewRR(i) - if err != nil { - t.Error("failed to parse RR: ", err) - continue - } - if rr.String() != o { - t.Errorf("`%s' should be equal to\n`%s', but is `%s'", i, o, rr.String()) - } - } -} - func TestParseCAA(t *testing.T) { lt := map[string]string{ "example.net. CAA 0 issue \"symantec.com\"": "example.net.\t3600\tIN\tCAA\t0 issue \"symantec.com\"", @@ -1609,18 +1569,7 @@ func TestParseSVCB(t *testing.T) { // From draft-ietf-add-ddr-06 `_dns.example.net. SVCB 1 example.net. alpn=h2 dohpath=/dns-query{?dns}`: `_dns.example.net. 3600 IN SVCB 1 example.net. alpn="h2" dohpath="/dns-query{?dns}"`, `_dns.example.net. SVCB 1 example.net. alpn=h2 dohpath=/dns\045query{\?dns}`: `_dns.example.net. 3600 IN SVCB 1 example.net. alpn="h2" dohpath="/dns-query{?dns}"`, - // From RFC9461 Section 7 (https://datatracker.ietf.org/doc/html/rfc9461#section-7) - `_dns.simple.example. 7200 IN SVCB 1 simple.example. alpn=dot`: `_dns.simple.example. 7200 IN SVCB 1 simple.example. alpn="dot"`, - `_dns.doh.example. 7200 IN SVCB 1 doh.example. alpn=h2 dohpath=/dns-query{?dns}`: `_dns.doh.example. 7200 IN SVCB 1 doh.example. alpn="h2" dohpath="/dns-query{?dns}"`, - `_dns.resolver.example. 7200 IN SVCB 1 resolver.example. alpn=dot,doq,h2,h3 dohpath=/q{?dns}`: `_dns.resolver.example. 7200 IN SVCB 1 resolver.example. alpn="dot,doq,h2,h3" dohpath="/q{?dns}"`, - `_dns.resolver.example. 7200 IN SVCB 2 resolver.example. alpn=dot port=8530`: `_dns.resolver.example. 7200 IN SVCB 2 resolver.example. alpn="dot" port="8530"`, - // From RFC 9540 Section 4.2.1 (https://www.rfc-editor.org/rfc/rfc9540.html#name-the-ohttp-svcparamkey) - `_dns.resolver.arpa 7200 IN SVCB 1 doh.example.net alpn=h2 dohpath=/dns-query{?dns} ohttp`: `_dns.resolver.arpa. 7200 IN SVCB 1 doh.example.net. alpn="h2" dohpath="/dns-query{?dns}" ohttp=""`, - // From RFC 9540 Section 4.1 (HTTPS RR) (https://www.rfc-editor.org/rfc/rfc9540.html#name-use-in-https-service-rrs) - `svc.example.com. 7200 IN HTTPS 1 . alpn=h2 ohttp`: `svc.example.com. 7200 IN HTTPS 1 . alpn="h2" ohttp=""`, - `svc.example.com. 7200 IN HTTPS 1 . mandatory=ohttp ohttp`: `svc.example.com. 7200 IN HTTPS 1 . mandatory="ohttp" ohttp=""`, } - for s, o := range svcbs { rr, err := NewRR(s) if err != nil { diff --git a/privaterr.go b/privaterr.go index 350ea5a47a..d256b652ea 100644 --- a/privaterr.go +++ b/privaterr.go @@ -84,7 +84,7 @@ Fetch: err := r.Data.Parse(text) if err != nil { - return &ParseError{wrappedErr: err, lex: l} + return &ParseError{"", err.Error(), l} } return nil diff --git a/scan.go b/scan.go index e26e8027a4..062d8ff3a0 100644 --- a/scan.go +++ b/scan.go @@ -4,9 +4,7 @@ import ( "bufio" "fmt" "io" - "io/fs" "os" - "path" "path/filepath" "strconv" "strings" @@ -66,26 +64,20 @@ const ( // ParseError is a parsing error. It contains the parse error and the location in the io.Reader // where the error occurred. type ParseError struct { - file string - err string - wrappedErr error - lex lex + file string + err string + lex lex } func (e *ParseError) Error() (s string) { if e.file != "" { s = e.file + ": " } - if e.err == "" && e.wrappedErr != nil { - e.err = e.wrappedErr.Error() - } s += "dns: " + e.err + ": " + strconv.QuoteToASCII(e.lex.token) + " at line: " + strconv.Itoa(e.lex.line) + ":" + strconv.Itoa(e.lex.column) return } -func (e *ParseError) Unwrap() error { return e.wrappedErr } - type lex struct { token string // text of the token err bool // when true, token text has lexer error @@ -101,13 +93,12 @@ type ttlState struct { isByDirective bool // isByDirective indicates whether ttl was set by a $TTL directive } -// NewRR reads a string s and returns the first RR. +// NewRR reads the RR contained in the string s. Only the first RR is returned. // If s contains no records, NewRR will return nil with no error. // -// The class defaults to IN, TTL defaults to 3600, and -// origin for resolving relative domain names defaults to the DNS root (.). -// Full zone file syntax is supported, including directives like $TTL and $ORIGIN. -// All fields of the returned RR are set from the read data, except RR.Header().Rdlength which is set to 0. +// The class defaults to IN and TTL defaults to 3600. The full zone file syntax +// like $TTL, $ORIGIN, etc. is supported. All fields of the returned RR are +// set, except RR.Header().Rdlength which is set to 0. func NewRR(s string) (RR, error) { if len(s) > 0 && s[len(s)-1] != '\n' { // We need a closing newline return ReadRR(strings.NewReader(s+"\n"), "") @@ -177,9 +168,8 @@ type ZoneParser struct { // sub is used to parse $INCLUDE files and $GENERATE directives. // Next, by calling subNext, forwards the resulting RRs from this // sub parser to the calling code. - sub *ZoneParser - r io.Reader - fsys fs.FS + sub *ZoneParser + osFile *os.File includeDepth uint8 @@ -198,7 +188,7 @@ func NewZoneParser(r io.Reader, origin, file string) *ZoneParser { if origin != "" { origin = Fqdn(origin) if _, ok := IsDomainName(origin); !ok { - pe = &ParseError{file: file, err: "bad initial origin name"} + pe = &ParseError{file, "bad initial origin name", lex{}} } } @@ -230,24 +220,6 @@ func (zp *ZoneParser) SetIncludeAllowed(v bool) { zp.includeAllowed = v } -// SetIncludeFS provides an [fs.FS] to use when looking for the target of -// $INCLUDE directives. ($INCLUDE must still be enabled separately by calling -// [ZoneParser.SetIncludeAllowed].) If fsys is nil, [os.Open] will be used. -// -// When fsys is an on-disk FS, the ability of $INCLUDE to reach files from -// outside its root directory depends upon the FS implementation. For -// instance, [os.DirFS] will refuse to open paths like "../../etc/passwd", -// however it will still follow links which may point anywhere on the system. -// -// FS paths are slash-separated on all systems, even Windows. $INCLUDE paths -// containing other characters such as backslash and colon may be accepted as -// valid, but those characters will never be interpreted by an FS -// implementation as path element separators. See [fs.ValidPath] for more -// details. -func (zp *ZoneParser) SetIncludeFS(fsys fs.FS) { - zp.fsys = fsys -} - // Err returns the first non-EOF error that was encountered by the // ZoneParser. func (zp *ZoneParser) Err() error { @@ -265,7 +237,7 @@ func (zp *ZoneParser) Err() error { } func (zp *ZoneParser) setParseError(err string, l lex) (RR, bool) { - zp.parseErr = &ParseError{file: zp.file, err: err, lex: l} + zp.parseErr = &ParseError{zp.file, err, l} return nil, false } @@ -288,11 +260,9 @@ func (zp *ZoneParser) subNext() (RR, bool) { return rr, true } - if zp.sub.r != nil { - if c, ok := zp.sub.r.(io.Closer); ok { - c.Close() - } - zp.sub.r = nil + if zp.sub.osFile != nil { + zp.sub.osFile.Close() + zp.sub.osFile = nil } if zp.sub.Err() != nil { @@ -432,44 +402,24 @@ func (zp *ZoneParser) Next() (RR, bool) { // Start with the new file includePath := l.token - var r1 io.Reader - var e1 error - if zp.fsys != nil { - // fs.FS always uses / as separator, even on Windows, so use - // path instead of filepath here: - if !path.IsAbs(includePath) { - includePath = path.Join(path.Dir(zp.file), includePath) - } - - // os.DirFS, and probably others, expect all paths to be - // relative, so clean the path and remove leading / if - // present: - includePath = strings.TrimLeft(path.Clean(includePath), "/") - - r1, e1 = zp.fsys.Open(includePath) - } else { - if !filepath.IsAbs(includePath) { - includePath = filepath.Join(filepath.Dir(zp.file), includePath) - } - r1, e1 = os.Open(includePath) + if !filepath.IsAbs(includePath) { + includePath = filepath.Join(filepath.Dir(zp.file), includePath) } + + r1, e1 := os.Open(includePath) if e1 != nil { var as string - if includePath != l.token { + if !filepath.IsAbs(l.token) { as = fmt.Sprintf(" as `%s'", includePath) } - zp.parseErr = &ParseError{ - file: zp.file, - wrappedErr: fmt.Errorf("failed to open `%s'%s: %w", l.token, as, e1), - lex: l, - } - return nil, false + + msg := fmt.Sprintf("failed to open `%s'%s: %v", l.token, as, e1) + return zp.setParseError(msg, l) } zp.sub = NewZoneParser(r1, neworigin, includePath) - zp.sub.defttl, zp.sub.includeDepth, zp.sub.r = zp.defttl, zp.includeDepth+1, r1 + zp.sub.defttl, zp.sub.includeDepth, zp.sub.osFile = zp.defttl, zp.includeDepth+1, r1 zp.sub.SetIncludeAllowed(true) - zp.sub.SetIncludeFS(zp.fsys) return zp.subNext() case zExpectDirTTLBl: if l.value != zBlank { @@ -1283,7 +1233,7 @@ func stringToCm(token string) (e, m uint8, ok bool) { cmeters *= 10 } } - // This slightly ugly condition will allow omitting the 'meter' part, like .01 (meaning 0.01m = 1cm). + // This slighly ugly condition will allow omitting the 'meter' part, like .01 (meaning 0.01m = 1cm). if !hasCM || mStr != "" { meters, err = strconv.Atoi(mStr) // RFC1876 states the max value is 90000000.00. The latter two conditions enforce it. @@ -1376,12 +1326,12 @@ func slurpRemainder(c *zlexer) *ParseError { case zBlank: l, _ = c.Next() if l.value != zNewline && l.value != zEOF { - return &ParseError{err: "garbage after rdata", lex: l} + return &ParseError{"", "garbage after rdata", l} } case zNewline: case zEOF: default: - return &ParseError{err: "garbage after rdata", lex: l} + return &ParseError{"", "garbage after rdata", l} } return nil } @@ -1390,16 +1340,16 @@ func slurpRemainder(c *zlexer) *ParseError { // Used for NID and L64 record. func stringToNodeID(l lex) (uint64, *ParseError) { if len(l.token) < 19 { - return 0, &ParseError{file: l.token, err: "bad NID/L64 NodeID/Locator64", lex: l} + return 0, &ParseError{l.token, "bad NID/L64 NodeID/Locator64", l} } // There must be three colons at fixes positions, if not its a parse error if l.token[4] != ':' && l.token[9] != ':' && l.token[14] != ':' { - return 0, &ParseError{file: l.token, err: "bad NID/L64 NodeID/Locator64", lex: l} + return 0, &ParseError{l.token, "bad NID/L64 NodeID/Locator64", l} } s := l.token[0:4] + l.token[5:9] + l.token[10:14] + l.token[15:19] u, err := strconv.ParseUint(s, 16, 64) if err != nil { - return 0, &ParseError{file: l.token, err: "bad NID/L64 NodeID/Locator64", lex: l} + return 0, &ParseError{l.token, "bad NID/L64 NodeID/Locator64", l} } return u, nil } diff --git a/scan_rr.go b/scan_rr.go index c1a76995e7..a635e1c5cb 100644 --- a/scan_rr.go +++ b/scan_rr.go @@ -3,7 +3,6 @@ package dns import ( "encoding/base64" "errors" - "fmt" "net" "strconv" "strings" @@ -16,14 +15,14 @@ func endingToString(c *zlexer, errstr string) (string, *ParseError) { l, _ := c.Next() // zString for l.value != zNewline && l.value != zEOF { if l.err { - return s.String(), &ParseError{err: errstr, lex: l} + return s.String(), &ParseError{"", errstr, l} } switch l.value { case zString: s.WriteString(l.token) case zBlank: // Ok default: - return "", &ParseError{err: errstr, lex: l} + return "", &ParseError{"", errstr, l} } l, _ = c.Next() } @@ -37,7 +36,7 @@ func endingToTxtSlice(c *zlexer, errstr string) ([]string, *ParseError) { // Get the remaining data until we see a zNewline l, _ := c.Next() if l.err { - return nil, &ParseError{err: errstr, lex: l} + return nil, &ParseError{"", errstr, l} } // Build the slice @@ -46,33 +45,34 @@ func endingToTxtSlice(c *zlexer, errstr string) ([]string, *ParseError) { empty := false for l.value != zNewline && l.value != zEOF { if l.err { - return nil, &ParseError{err: errstr, lex: l} + return nil, &ParseError{"", errstr, l} } switch l.value { case zString: empty = false - // split up tokens that are larger than 255 into 255-chunks - sx := []string{} - p := 0 - for { - i, ok := escapedStringOffset(l.token[p:], 255) - if !ok { - return nil, &ParseError{err: errstr, lex: l} - } - if i != -1 && p+i != len(l.token) { - sx = append(sx, l.token[p:p+i]) - } else { - sx = append(sx, l.token[p:]) - break - + if len(l.token) > 255 { + // split up tokens that are larger than 255 into 255-chunks + sx := []string{} + p, i := 0, 255 + for { + if i <= len(l.token) { + sx = append(sx, l.token[p:i]) + } else { + sx = append(sx, l.token[p:]) + break + + } + p, i = p+255, i+255 } - p += i + s = append(s, sx...) + break } - s = append(s, sx...) + + s = append(s, l.token) case zBlank: if quote { // zBlank can only be seen in between txt parts. - return nil, &ParseError{err: errstr, lex: l} + return nil, &ParseError{"", errstr, l} } case zQuote: if empty && quote { @@ -81,13 +81,13 @@ func endingToTxtSlice(c *zlexer, errstr string) ([]string, *ParseError) { quote = !quote empty = true default: - return nil, &ParseError{err: errstr, lex: l} + return nil, &ParseError{"", errstr, l} } l, _ = c.Next() } if quote { - return nil, &ParseError{err: errstr, lex: l} + return nil, &ParseError{"", errstr, l} } return s, nil @@ -102,7 +102,7 @@ func (rr *A) parse(c *zlexer, o string) *ParseError { // IPv4. isIPv4 := !strings.Contains(l.token, ":") if rr.A == nil || !isIPv4 || l.err { - return &ParseError{err: "bad A A", lex: l} + return &ParseError{"", "bad A A", l} } return slurpRemainder(c) } @@ -114,7 +114,7 @@ func (rr *AAAA) parse(c *zlexer, o string) *ParseError { // addresses cannot include ":". isIPv6 := strings.Contains(l.token, ":") if rr.AAAA == nil || !isIPv6 || l.err { - return &ParseError{err: "bad AAAA AAAA", lex: l} + return &ParseError{"", "bad AAAA AAAA", l} } return slurpRemainder(c) } @@ -123,7 +123,7 @@ func (rr *NS) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{err: "bad NS Ns", lex: l} + return &ParseError{"", "bad NS Ns", l} } rr.Ns = name return slurpRemainder(c) @@ -133,7 +133,7 @@ func (rr *PTR) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{err: "bad PTR Ptr", lex: l} + return &ParseError{"", "bad PTR Ptr", l} } rr.Ptr = name return slurpRemainder(c) @@ -143,7 +143,7 @@ func (rr *NSAPPTR) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{err: "bad NSAP-PTR Ptr", lex: l} + return &ParseError{"", "bad NSAP-PTR Ptr", l} } rr.Ptr = name return slurpRemainder(c) @@ -153,7 +153,7 @@ func (rr *RP) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() mbox, mboxOk := toAbsoluteName(l.token, o) if l.err || !mboxOk { - return &ParseError{err: "bad RP Mbox", lex: l} + return &ParseError{"", "bad RP Mbox", l} } rr.Mbox = mbox @@ -163,7 +163,7 @@ func (rr *RP) parse(c *zlexer, o string) *ParseError { txt, txtOk := toAbsoluteName(l.token, o) if l.err || !txtOk { - return &ParseError{err: "bad RP Txt", lex: l} + return &ParseError{"", "bad RP Txt", l} } rr.Txt = txt @@ -174,7 +174,7 @@ func (rr *MR) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{err: "bad MR Mr", lex: l} + return &ParseError{"", "bad MR Mr", l} } rr.Mr = name return slurpRemainder(c) @@ -184,7 +184,7 @@ func (rr *MB) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{err: "bad MB Mb", lex: l} + return &ParseError{"", "bad MB Mb", l} } rr.Mb = name return slurpRemainder(c) @@ -194,7 +194,7 @@ func (rr *MG) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{err: "bad MG Mg", lex: l} + return &ParseError{"", "bad MG Mg", l} } rr.Mg = name return slurpRemainder(c) @@ -219,29 +219,6 @@ func (rr *HINFO) parse(c *zlexer, o string) *ParseError { rr.Cpu = chunks[0] rr.Os = strings.Join(chunks[1:], " ") - return nil -} - -// according to RFC 1183 the parsing is identical to HINFO, so just use that code. -func (rr *ISDN) parse(c *zlexer, o string) *ParseError { - chunks, e := endingToTxtSlice(c, "bad ISDN Fields") - if e != nil { - return e - } - - if ln := len(chunks); ln == 0 { - return nil - } else if ln == 1 { - // Can we split it? - if out := strings.Fields(chunks[0]); len(out) > 1 { - chunks = out - } else { - chunks = append(chunks, "") - } - } - - rr.Address = chunks[0] - rr.SubAddress = strings.Join(chunks[1:], " ") return nil } @@ -250,7 +227,7 @@ func (rr *MINFO) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() rmail, rmailOk := toAbsoluteName(l.token, o) if l.err || !rmailOk { - return &ParseError{err: "bad MINFO Rmail", lex: l} + return &ParseError{"", "bad MINFO Rmail", l} } rr.Rmail = rmail @@ -260,7 +237,7 @@ func (rr *MINFO) parse(c *zlexer, o string) *ParseError { email, emailOk := toAbsoluteName(l.token, o) if l.err || !emailOk { - return &ParseError{err: "bad MINFO Email", lex: l} + return &ParseError{"", "bad MINFO Email", l} } rr.Email = email @@ -271,7 +248,7 @@ func (rr *MF) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{err: "bad MF Mf", lex: l} + return &ParseError{"", "bad MF Mf", l} } rr.Mf = name return slurpRemainder(c) @@ -281,7 +258,7 @@ func (rr *MD) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{err: "bad MD Md", lex: l} + return &ParseError{"", "bad MD Md", l} } rr.Md = name return slurpRemainder(c) @@ -291,7 +268,7 @@ func (rr *MX) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{err: "bad MX Pref", lex: l} + return &ParseError{"", "bad MX Pref", l} } rr.Preference = uint16(i) @@ -301,7 +278,7 @@ func (rr *MX) parse(c *zlexer, o string) *ParseError { name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{err: "bad MX Mx", lex: l} + return &ParseError{"", "bad MX Mx", l} } rr.Mx = name @@ -312,7 +289,7 @@ func (rr *RT) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil { - return &ParseError{err: "bad RT Preference", lex: l} + return &ParseError{"", "bad RT Preference", l} } rr.Preference = uint16(i) @@ -322,7 +299,7 @@ func (rr *RT) parse(c *zlexer, o string) *ParseError { name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{err: "bad RT Host", lex: l} + return &ParseError{"", "bad RT Host", l} } rr.Host = name @@ -333,7 +310,7 @@ func (rr *AFSDB) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{err: "bad AFSDB Subtype", lex: l} + return &ParseError{"", "bad AFSDB Subtype", l} } rr.Subtype = uint16(i) @@ -343,7 +320,7 @@ func (rr *AFSDB) parse(c *zlexer, o string) *ParseError { name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{err: "bad AFSDB Hostname", lex: l} + return &ParseError{"", "bad AFSDB Hostname", l} } rr.Hostname = name return slurpRemainder(c) @@ -352,7 +329,7 @@ func (rr *AFSDB) parse(c *zlexer, o string) *ParseError { func (rr *X25) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() if l.err { - return &ParseError{err: "bad X25 PSDNAddress", lex: l} + return &ParseError{"", "bad X25 PSDNAddress", l} } rr.PSDNAddress = l.token return slurpRemainder(c) @@ -362,7 +339,7 @@ func (rr *KX) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{err: "bad KX Pref", lex: l} + return &ParseError{"", "bad KX Pref", l} } rr.Preference = uint16(i) @@ -372,7 +349,7 @@ func (rr *KX) parse(c *zlexer, o string) *ParseError { name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{err: "bad KX Exchanger", lex: l} + return &ParseError{"", "bad KX Exchanger", l} } rr.Exchanger = name return slurpRemainder(c) @@ -382,7 +359,7 @@ func (rr *CNAME) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{err: "bad CNAME Target", lex: l} + return &ParseError{"", "bad CNAME Target", l} } rr.Target = name return slurpRemainder(c) @@ -392,7 +369,7 @@ func (rr *DNAME) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{err: "bad DNAME Target", lex: l} + return &ParseError{"", "bad DNAME Target", l} } rr.Target = name return slurpRemainder(c) @@ -402,7 +379,7 @@ func (rr *SOA) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() ns, nsOk := toAbsoluteName(l.token, o) if l.err || !nsOk { - return &ParseError{err: "bad SOA Ns", lex: l} + return &ParseError{"", "bad SOA Ns", l} } rr.Ns = ns @@ -412,7 +389,7 @@ func (rr *SOA) parse(c *zlexer, o string) *ParseError { mbox, mboxOk := toAbsoluteName(l.token, o) if l.err || !mboxOk { - return &ParseError{err: "bad SOA Mbox", lex: l} + return &ParseError{"", "bad SOA Mbox", l} } rr.Mbox = mbox @@ -425,16 +402,16 @@ func (rr *SOA) parse(c *zlexer, o string) *ParseError { for i := 0; i < 5; i++ { l, _ = c.Next() if l.err { - return &ParseError{err: "bad SOA zone parameter", lex: l} + return &ParseError{"", "bad SOA zone parameter", l} } if j, err := strconv.ParseUint(l.token, 10, 32); err != nil { if i == 0 { // Serial must be a number - return &ParseError{err: "bad SOA zone parameter", lex: l} + return &ParseError{"", "bad SOA zone parameter", l} } // We allow other fields to be unitful duration strings if v, ok = stringToTTL(l.token); !ok { - return &ParseError{err: "bad SOA zone parameter", lex: l} + return &ParseError{"", "bad SOA zone parameter", l} } } else { @@ -464,7 +441,7 @@ func (rr *SRV) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{err: "bad SRV Priority", lex: l} + return &ParseError{"", "bad SRV Priority", l} } rr.Priority = uint16(i) @@ -472,7 +449,7 @@ func (rr *SRV) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() // zString i, e1 := strconv.ParseUint(l.token, 10, 16) if e1 != nil || l.err { - return &ParseError{err: "bad SRV Weight", lex: l} + return &ParseError{"", "bad SRV Weight", l} } rr.Weight = uint16(i) @@ -480,7 +457,7 @@ func (rr *SRV) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() // zString i, e2 := strconv.ParseUint(l.token, 10, 16) if e2 != nil || l.err { - return &ParseError{err: "bad SRV Port", lex: l} + return &ParseError{"", "bad SRV Port", l} } rr.Port = uint16(i) @@ -490,7 +467,7 @@ func (rr *SRV) parse(c *zlexer, o string) *ParseError { name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{err: "bad SRV Target", lex: l} + return &ParseError{"", "bad SRV Target", l} } rr.Target = name return slurpRemainder(c) @@ -500,7 +477,7 @@ func (rr *NAPTR) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{err: "bad NAPTR Order", lex: l} + return &ParseError{"", "bad NAPTR Order", l} } rr.Order = uint16(i) @@ -508,7 +485,7 @@ func (rr *NAPTR) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() // zString i, e1 := strconv.ParseUint(l.token, 10, 16) if e1 != nil || l.err { - return &ParseError{err: "bad NAPTR Preference", lex: l} + return &ParseError{"", "bad NAPTR Preference", l} } rr.Preference = uint16(i) @@ -516,57 +493,57 @@ func (rr *NAPTR) parse(c *zlexer, o string) *ParseError { c.Next() // zBlank l, _ = c.Next() // _QUOTE if l.value != zQuote { - return &ParseError{err: "bad NAPTR Flags", lex: l} + return &ParseError{"", "bad NAPTR Flags", l} } l, _ = c.Next() // Either String or Quote if l.value == zString { rr.Flags = l.token l, _ = c.Next() // _QUOTE if l.value != zQuote { - return &ParseError{err: "bad NAPTR Flags", lex: l} + return &ParseError{"", "bad NAPTR Flags", l} } } else if l.value == zQuote { rr.Flags = "" } else { - return &ParseError{err: "bad NAPTR Flags", lex: l} + return &ParseError{"", "bad NAPTR Flags", l} } // Service c.Next() // zBlank l, _ = c.Next() // _QUOTE if l.value != zQuote { - return &ParseError{err: "bad NAPTR Service", lex: l} + return &ParseError{"", "bad NAPTR Service", l} } l, _ = c.Next() // Either String or Quote if l.value == zString { rr.Service = l.token l, _ = c.Next() // _QUOTE if l.value != zQuote { - return &ParseError{err: "bad NAPTR Service", lex: l} + return &ParseError{"", "bad NAPTR Service", l} } } else if l.value == zQuote { rr.Service = "" } else { - return &ParseError{err: "bad NAPTR Service", lex: l} + return &ParseError{"", "bad NAPTR Service", l} } // Regexp c.Next() // zBlank l, _ = c.Next() // _QUOTE if l.value != zQuote { - return &ParseError{err: "bad NAPTR Regexp", lex: l} + return &ParseError{"", "bad NAPTR Regexp", l} } l, _ = c.Next() // Either String or Quote if l.value == zString { rr.Regexp = l.token l, _ = c.Next() // _QUOTE if l.value != zQuote { - return &ParseError{err: "bad NAPTR Regexp", lex: l} + return &ParseError{"", "bad NAPTR Regexp", l} } } else if l.value == zQuote { rr.Regexp = "" } else { - return &ParseError{err: "bad NAPTR Regexp", lex: l} + return &ParseError{"", "bad NAPTR Regexp", l} } // After quote no space?? @@ -576,7 +553,7 @@ func (rr *NAPTR) parse(c *zlexer, o string) *ParseError { name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{err: "bad NAPTR Replacement", lex: l} + return &ParseError{"", "bad NAPTR Replacement", l} } rr.Replacement = name return slurpRemainder(c) @@ -586,7 +563,7 @@ func (rr *TALINK) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() previousName, previousNameOk := toAbsoluteName(l.token, o) if l.err || !previousNameOk { - return &ParseError{err: "bad TALINK PreviousName", lex: l} + return &ParseError{"", "bad TALINK PreviousName", l} } rr.PreviousName = previousName @@ -596,7 +573,7 @@ func (rr *TALINK) parse(c *zlexer, o string) *ParseError { nextName, nextNameOk := toAbsoluteName(l.token, o) if l.err || !nextNameOk { - return &ParseError{err: "bad TALINK NextName", lex: l} + return &ParseError{"", "bad TALINK NextName", l} } rr.NextName = nextName @@ -614,7 +591,7 @@ func (rr *LOC) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 32) if e != nil || l.err || i > 90 { - return &ParseError{err: "bad LOC Latitude", lex: l} + return &ParseError{"", "bad LOC Latitude", l} } rr.Latitude = 1000 * 60 * 60 * uint32(i) @@ -625,7 +602,7 @@ func (rr *LOC) parse(c *zlexer, o string) *ParseError { goto East } if i, err := strconv.ParseUint(l.token, 10, 32); err != nil || l.err || i > 59 { - return &ParseError{err: "bad LOC Latitude minutes", lex: l} + return &ParseError{"", "bad LOC Latitude minutes", l} } else { rr.Latitude += 1000 * 60 * uint32(i) } @@ -633,7 +610,7 @@ func (rr *LOC) parse(c *zlexer, o string) *ParseError { c.Next() // zBlank l, _ = c.Next() if i, err := strconv.ParseFloat(l.token, 64); err != nil || l.err || i < 0 || i >= 60 { - return &ParseError{err: "bad LOC Latitude seconds", lex: l} + return &ParseError{"", "bad LOC Latitude seconds", l} } else { rr.Latitude += uint32(1000 * i) } @@ -644,14 +621,14 @@ func (rr *LOC) parse(c *zlexer, o string) *ParseError { goto East } // If still alive, flag an error - return &ParseError{err: "bad LOC Latitude North/South", lex: l} + return &ParseError{"", "bad LOC Latitude North/South", l} East: // East c.Next() // zBlank l, _ = c.Next() if i, err := strconv.ParseUint(l.token, 10, 32); err != nil || l.err || i > 180 { - return &ParseError{err: "bad LOC Longitude", lex: l} + return &ParseError{"", "bad LOC Longitude", l} } else { rr.Longitude = 1000 * 60 * 60 * uint32(i) } @@ -662,14 +639,14 @@ East: goto Altitude } if i, err := strconv.ParseUint(l.token, 10, 32); err != nil || l.err || i > 59 { - return &ParseError{err: "bad LOC Longitude minutes", lex: l} + return &ParseError{"", "bad LOC Longitude minutes", l} } else { rr.Longitude += 1000 * 60 * uint32(i) } c.Next() // zBlank l, _ = c.Next() if i, err := strconv.ParseFloat(l.token, 64); err != nil || l.err || i < 0 || i >= 60 { - return &ParseError{err: "bad LOC Longitude seconds", lex: l} + return &ParseError{"", "bad LOC Longitude seconds", l} } else { rr.Longitude += uint32(1000 * i) } @@ -680,19 +657,19 @@ East: goto Altitude } // If still alive, flag an error - return &ParseError{err: "bad LOC Longitude East/West", lex: l} + return &ParseError{"", "bad LOC Longitude East/West", l} Altitude: c.Next() // zBlank l, _ = c.Next() if l.token == "" || l.err { - return &ParseError{err: "bad LOC Altitude", lex: l} + return &ParseError{"", "bad LOC Altitude", l} } if l.token[len(l.token)-1] == 'M' || l.token[len(l.token)-1] == 'm' { l.token = l.token[0 : len(l.token)-1] } if i, err := strconv.ParseFloat(l.token, 64); err != nil { - return &ParseError{err: "bad LOC Altitude", lex: l} + return &ParseError{"", "bad LOC Altitude", l} } else { rr.Altitude = uint32(i*100.0 + 10000000.0 + 0.5) } @@ -707,19 +684,19 @@ Altitude: case 0: // Size exp, m, ok := stringToCm(l.token) if !ok { - return &ParseError{err: "bad LOC Size", lex: l} + return &ParseError{"", "bad LOC Size", l} } rr.Size = exp&0x0f | m<<4&0xf0 case 1: // HorizPre exp, m, ok := stringToCm(l.token) if !ok { - return &ParseError{err: "bad LOC HorizPre", lex: l} + return &ParseError{"", "bad LOC HorizPre", l} } rr.HorizPre = exp&0x0f | m<<4&0xf0 case 2: // VertPre exp, m, ok := stringToCm(l.token) if !ok { - return &ParseError{err: "bad LOC VertPre", lex: l} + return &ParseError{"", "bad LOC VertPre", l} } rr.VertPre = exp&0x0f | m<<4&0xf0 } @@ -727,7 +704,7 @@ Altitude: case zBlank: // Ok default: - return &ParseError{err: "bad LOC Size, HorizPre or VertPre", lex: l} + return &ParseError{"", "bad LOC Size, HorizPre or VertPre", l} } l, _ = c.Next() } @@ -739,14 +716,14 @@ func (rr *HIP) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{err: "bad HIP PublicKeyAlgorithm", lex: l} + return &ParseError{"", "bad HIP PublicKeyAlgorithm", l} } rr.PublicKeyAlgorithm = uint8(i) c.Next() // zBlank l, _ = c.Next() // zString if l.token == "" || l.err { - return &ParseError{err: "bad HIP Hit", lex: l} + return &ParseError{"", "bad HIP Hit", l} } rr.Hit = l.token // This can not contain spaces, see RFC 5205 Section 6. rr.HitLength = uint8(len(rr.Hit)) / 2 @@ -754,12 +731,12 @@ func (rr *HIP) parse(c *zlexer, o string) *ParseError { c.Next() // zBlank l, _ = c.Next() // zString if l.token == "" || l.err { - return &ParseError{err: "bad HIP PublicKey", lex: l} + return &ParseError{"", "bad HIP PublicKey", l} } rr.PublicKey = l.token // This cannot contain spaces decodedPK, decodedPKerr := base64.StdEncoding.DecodeString(rr.PublicKey) if decodedPKerr != nil { - return &ParseError{err: "bad HIP PublicKey", lex: l} + return &ParseError{"", "bad HIP PublicKey", l} } rr.PublicKeyLength = uint16(len(decodedPK)) @@ -771,13 +748,13 @@ func (rr *HIP) parse(c *zlexer, o string) *ParseError { case zString: name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{err: "bad HIP RendezvousServers", lex: l} + return &ParseError{"", "bad HIP RendezvousServers", l} } xs = append(xs, name) case zBlank: // Ok default: - return &ParseError{err: "bad HIP RendezvousServers", lex: l} + return &ParseError{"", "bad HIP RendezvousServers", l} } l, _ = c.Next() } @@ -791,7 +768,7 @@ func (rr *CERT) parse(c *zlexer, o string) *ParseError { if v, ok := StringToCertType[l.token]; ok { rr.Type = v } else if i, err := strconv.ParseUint(l.token, 10, 16); err != nil { - return &ParseError{err: "bad CERT Type", lex: l} + return &ParseError{"", "bad CERT Type", l} } else { rr.Type = uint16(i) } @@ -799,7 +776,7 @@ func (rr *CERT) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() // zString i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{err: "bad CERT KeyTag", lex: l} + return &ParseError{"", "bad CERT KeyTag", l} } rr.KeyTag = uint16(i) c.Next() // zBlank @@ -807,7 +784,7 @@ func (rr *CERT) parse(c *zlexer, o string) *ParseError { if v, ok := StringToAlgorithm[l.token]; ok { rr.Algorithm = v } else if i, err := strconv.ParseUint(l.token, 10, 8); err != nil { - return &ParseError{err: "bad CERT Algorithm", lex: l} + return &ParseError{"", "bad CERT Algorithm", l} } else { rr.Algorithm = uint8(i) } @@ -833,7 +810,7 @@ func (rr *CSYNC) parse(c *zlexer, o string) *ParseError { j, e := strconv.ParseUint(l.token, 10, 32) if e != nil { // Serial must be a number - return &ParseError{err: "bad CSYNC serial", lex: l} + return &ParseError{"", "bad CSYNC serial", l} } rr.Serial = uint32(j) @@ -843,7 +820,7 @@ func (rr *CSYNC) parse(c *zlexer, o string) *ParseError { j, e1 := strconv.ParseUint(l.token, 10, 16) if e1 != nil { // Serial must be a number - return &ParseError{err: "bad CSYNC flags", lex: l} + return &ParseError{"", "bad CSYNC flags", l} } rr.Flags = uint16(j) @@ -861,12 +838,12 @@ func (rr *CSYNC) parse(c *zlexer, o string) *ParseError { tokenUpper := strings.ToUpper(l.token) if k, ok = StringToType[tokenUpper]; !ok { if k, ok = typeToInt(l.token); !ok { - return &ParseError{err: "bad CSYNC TypeBitMap", lex: l} + return &ParseError{"", "bad CSYNC TypeBitMap", l} } } rr.TypeBitMap = append(rr.TypeBitMap, k) default: - return &ParseError{err: "bad CSYNC TypeBitMap", lex: l} + return &ParseError{"", "bad CSYNC TypeBitMap", l} } l, _ = c.Next() } @@ -877,7 +854,7 @@ func (rr *ZONEMD) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 32) if e != nil || l.err { - return &ParseError{err: "bad ZONEMD Serial", lex: l} + return &ParseError{"", "bad ZONEMD Serial", l} } rr.Serial = uint32(i) @@ -885,7 +862,7 @@ func (rr *ZONEMD) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() i, e1 := strconv.ParseUint(l.token, 10, 8) if e1 != nil || l.err { - return &ParseError{err: "bad ZONEMD Scheme", lex: l} + return &ParseError{"", "bad ZONEMD Scheme", l} } rr.Scheme = uint8(i) @@ -893,7 +870,7 @@ func (rr *ZONEMD) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() i, err := strconv.ParseUint(l.token, 10, 8) if err != nil || l.err { - return &ParseError{err: "bad ZONEMD Hash Algorithm", lex: l} + return &ParseError{"", "bad ZONEMD Hash Algorithm", l} } rr.Hash = uint8(i) @@ -914,11 +891,11 @@ func (rr *RRSIG) parse(c *zlexer, o string) *ParseError { if strings.HasPrefix(tokenUpper, "TYPE") { t, ok = typeToInt(l.token) if !ok { - return &ParseError{err: "bad RRSIG Typecovered", lex: l} + return &ParseError{"", "bad RRSIG Typecovered", l} } rr.TypeCovered = t } else { - return &ParseError{err: "bad RRSIG Typecovered", lex: l} + return &ParseError{"", "bad RRSIG Typecovered", l} } } else { rr.TypeCovered = t @@ -927,14 +904,14 @@ func (rr *RRSIG) parse(c *zlexer, o string) *ParseError { c.Next() // zBlank l, _ = c.Next() if l.err { - return &ParseError{err: "bad RRSIG Algorithm", lex: l} + return &ParseError{"", "bad RRSIG Algorithm", l} } i, e := strconv.ParseUint(l.token, 10, 8) rr.Algorithm = uint8(i) // if 0 we'll check the mnemonic in the if if e != nil { v, ok := StringToAlgorithm[l.token] if !ok { - return &ParseError{err: "bad RRSIG Algorithm", lex: l} + return &ParseError{"", "bad RRSIG Algorithm", l} } rr.Algorithm = v } @@ -943,7 +920,7 @@ func (rr *RRSIG) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() i, e1 := strconv.ParseUint(l.token, 10, 8) if e1 != nil || l.err { - return &ParseError{err: "bad RRSIG Labels", lex: l} + return &ParseError{"", "bad RRSIG Labels", l} } rr.Labels = uint8(i) @@ -951,7 +928,7 @@ func (rr *RRSIG) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() i, e2 := strconv.ParseUint(l.token, 10, 32) if e2 != nil || l.err { - return &ParseError{err: "bad RRSIG OrigTtl", lex: l} + return &ParseError{"", "bad RRSIG OrigTtl", l} } rr.OrigTtl = uint32(i) @@ -962,7 +939,7 @@ func (rr *RRSIG) parse(c *zlexer, o string) *ParseError { if i, err := strconv.ParseUint(l.token, 10, 32); err == nil { rr.Expiration = uint32(i) } else { - return &ParseError{err: "bad RRSIG Expiration", lex: l} + return &ParseError{"", "bad RRSIG Expiration", l} } } else { rr.Expiration = i @@ -974,7 +951,7 @@ func (rr *RRSIG) parse(c *zlexer, o string) *ParseError { if i, err := strconv.ParseUint(l.token, 10, 32); err == nil { rr.Inception = uint32(i) } else { - return &ParseError{err: "bad RRSIG Inception", lex: l} + return &ParseError{"", "bad RRSIG Inception", l} } } else { rr.Inception = i @@ -984,7 +961,7 @@ func (rr *RRSIG) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() i, e3 := strconv.ParseUint(l.token, 10, 16) if e3 != nil || l.err { - return &ParseError{err: "bad RRSIG KeyTag", lex: l} + return &ParseError{"", "bad RRSIG KeyTag", l} } rr.KeyTag = uint16(i) @@ -993,7 +970,7 @@ func (rr *RRSIG) parse(c *zlexer, o string) *ParseError { rr.SignerName = l.token name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{err: "bad RRSIG SignerName", lex: l} + return &ParseError{"", "bad RRSIG SignerName", l} } rr.SignerName = name @@ -1006,13 +983,11 @@ func (rr *RRSIG) parse(c *zlexer, o string) *ParseError { return nil } -func (rr *NXT) parse(c *zlexer, o string) *ParseError { return rr.NSEC.parse(c, o) } - func (rr *NSEC) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{err: "bad NSEC NextDomain", lex: l} + return &ParseError{"", "bad NSEC NextDomain", l} } rr.NextDomain = name @@ -1030,12 +1005,12 @@ func (rr *NSEC) parse(c *zlexer, o string) *ParseError { tokenUpper := strings.ToUpper(l.token) if k, ok = StringToType[tokenUpper]; !ok { if k, ok = typeToInt(l.token); !ok { - return &ParseError{err: "bad NSEC TypeBitMap", lex: l} + return &ParseError{"", "bad NSEC TypeBitMap", l} } } rr.TypeBitMap = append(rr.TypeBitMap, k) default: - return &ParseError{err: "bad NSEC TypeBitMap", lex: l} + return &ParseError{"", "bad NSEC TypeBitMap", l} } l, _ = c.Next() } @@ -1046,27 +1021,27 @@ func (rr *NSEC3) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{err: "bad NSEC3 Hash", lex: l} + return &ParseError{"", "bad NSEC3 Hash", l} } rr.Hash = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e1 := strconv.ParseUint(l.token, 10, 8) if e1 != nil || l.err { - return &ParseError{err: "bad NSEC3 Flags", lex: l} + return &ParseError{"", "bad NSEC3 Flags", l} } rr.Flags = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e2 := strconv.ParseUint(l.token, 10, 16) if e2 != nil || l.err { - return &ParseError{err: "bad NSEC3 Iterations", lex: l} + return &ParseError{"", "bad NSEC3 Iterations", l} } rr.Iterations = uint16(i) c.Next() l, _ = c.Next() if l.token == "" || l.err { - return &ParseError{err: "bad NSEC3 Salt", lex: l} + return &ParseError{"", "bad NSEC3 Salt", l} } if l.token != "-" { rr.SaltLength = uint8(len(l.token)) / 2 @@ -1076,7 +1051,7 @@ func (rr *NSEC3) parse(c *zlexer, o string) *ParseError { c.Next() l, _ = c.Next() if l.token == "" || l.err { - return &ParseError{err: "bad NSEC3 NextDomain", lex: l} + return &ParseError{"", "bad NSEC3 NextDomain", l} } rr.HashLength = 20 // Fix for NSEC3 (sha1 160 bits) rr.NextDomain = l.token @@ -1095,12 +1070,12 @@ func (rr *NSEC3) parse(c *zlexer, o string) *ParseError { tokenUpper := strings.ToUpper(l.token) if k, ok = StringToType[tokenUpper]; !ok { if k, ok = typeToInt(l.token); !ok { - return &ParseError{err: "bad NSEC3 TypeBitMap", lex: l} + return &ParseError{"", "bad NSEC3 TypeBitMap", l} } } rr.TypeBitMap = append(rr.TypeBitMap, k) default: - return &ParseError{err: "bad NSEC3 TypeBitMap", lex: l} + return &ParseError{"", "bad NSEC3 TypeBitMap", l} } l, _ = c.Next() } @@ -1111,21 +1086,21 @@ func (rr *NSEC3PARAM) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{err: "bad NSEC3PARAM Hash", lex: l} + return &ParseError{"", "bad NSEC3PARAM Hash", l} } rr.Hash = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e1 := strconv.ParseUint(l.token, 10, 8) if e1 != nil || l.err { - return &ParseError{err: "bad NSEC3PARAM Flags", lex: l} + return &ParseError{"", "bad NSEC3PARAM Flags", l} } rr.Flags = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e2 := strconv.ParseUint(l.token, 10, 16) if e2 != nil || l.err { - return &ParseError{err: "bad NSEC3PARAM Iterations", lex: l} + return &ParseError{"", "bad NSEC3PARAM Iterations", l} } rr.Iterations = uint16(i) c.Next() @@ -1140,7 +1115,7 @@ func (rr *NSEC3PARAM) parse(c *zlexer, o string) *ParseError { func (rr *EUI48) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() if len(l.token) != 17 || l.err { - return &ParseError{err: "bad EUI48 Address", lex: l} + return &ParseError{"", "bad EUI48 Address", l} } addr := make([]byte, 12) dash := 0 @@ -1149,7 +1124,7 @@ func (rr *EUI48) parse(c *zlexer, o string) *ParseError { addr[i+1] = l.token[i+1+dash] dash++ if l.token[i+1+dash] != '-' { - return &ParseError{err: "bad EUI48 Address", lex: l} + return &ParseError{"", "bad EUI48 Address", l} } } addr[10] = l.token[15] @@ -1157,7 +1132,7 @@ func (rr *EUI48) parse(c *zlexer, o string) *ParseError { i, e := strconv.ParseUint(string(addr), 16, 48) if e != nil { - return &ParseError{err: "bad EUI48 Address", lex: l} + return &ParseError{"", "bad EUI48 Address", l} } rr.Address = i return slurpRemainder(c) @@ -1166,7 +1141,7 @@ func (rr *EUI48) parse(c *zlexer, o string) *ParseError { func (rr *EUI64) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() if len(l.token) != 23 || l.err { - return &ParseError{err: "bad EUI64 Address", lex: l} + return &ParseError{"", "bad EUI64 Address", l} } addr := make([]byte, 16) dash := 0 @@ -1175,7 +1150,7 @@ func (rr *EUI64) parse(c *zlexer, o string) *ParseError { addr[i+1] = l.token[i+1+dash] dash++ if l.token[i+1+dash] != '-' { - return &ParseError{err: "bad EUI64 Address", lex: l} + return &ParseError{"", "bad EUI64 Address", l} } } addr[14] = l.token[21] @@ -1183,7 +1158,7 @@ func (rr *EUI64) parse(c *zlexer, o string) *ParseError { i, e := strconv.ParseUint(string(addr), 16, 64) if e != nil { - return &ParseError{err: "bad EUI68 Address", lex: l} + return &ParseError{"", "bad EUI68 Address", l} } rr.Address = i return slurpRemainder(c) @@ -1193,14 +1168,14 @@ func (rr *SSHFP) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{err: "bad SSHFP Algorithm", lex: l} + return &ParseError{"", "bad SSHFP Algorithm", l} } rr.Algorithm = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e1 := strconv.ParseUint(l.token, 10, 8) if e1 != nil || l.err { - return &ParseError{err: "bad SSHFP Type", lex: l} + return &ParseError{"", "bad SSHFP Type", l} } rr.Type = uint8(i) c.Next() // zBlank @@ -1216,21 +1191,21 @@ func (rr *DNSKEY) parseDNSKEY(c *zlexer, o, typ string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{err: "bad " + typ + " Flags", lex: l} + return &ParseError{"", "bad " + typ + " Flags", l} } rr.Flags = uint16(i) c.Next() // zBlank l, _ = c.Next() // zString i, e1 := strconv.ParseUint(l.token, 10, 8) if e1 != nil || l.err { - return &ParseError{err: "bad " + typ + " Protocol", lex: l} + return &ParseError{"", "bad " + typ + " Protocol", l} } rr.Protocol = uint8(i) c.Next() // zBlank l, _ = c.Next() // zString i, e2 := strconv.ParseUint(l.token, 10, 8) if e2 != nil || l.err { - return &ParseError{err: "bad " + typ + " Algorithm", lex: l} + return &ParseError{"", "bad " + typ + " Algorithm", l} } rr.Algorithm = uint8(i) s, e3 := endingToString(c, "bad "+typ+" PublicKey") @@ -1252,7 +1227,7 @@ func (rr *IPSECKEY) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() num, err := strconv.ParseUint(l.token, 10, 8) if err != nil || l.err { - return &ParseError{err: "bad IPSECKEY value", lex: l} + return &ParseError{"", "bad IPSECKEY value", l} } rr.Precedence = uint8(num) c.Next() // zBlank @@ -1260,7 +1235,7 @@ func (rr *IPSECKEY) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() num, err = strconv.ParseUint(l.token, 10, 8) if err != nil || l.err { - return &ParseError{err: "bad IPSECKEY value", lex: l} + return &ParseError{"", "bad IPSECKEY value", l} } rr.GatewayType = uint8(num) c.Next() // zBlank @@ -1268,19 +1243,19 @@ func (rr *IPSECKEY) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() num, err = strconv.ParseUint(l.token, 10, 8) if err != nil || l.err { - return &ParseError{err: "bad IPSECKEY value", lex: l} + return &ParseError{"", "bad IPSECKEY value", l} } rr.Algorithm = uint8(num) c.Next() // zBlank l, _ = c.Next() if l.err { - return &ParseError{err: "bad IPSECKEY gateway", lex: l} + return &ParseError{"", "bad IPSECKEY gateway", l} } rr.GatewayAddr, rr.GatewayHost, err = parseAddrHostUnion(l.token, o, rr.GatewayType) if err != nil { - return &ParseError{wrappedErr: fmt.Errorf("IPSECKEY %w", err), lex: l} + return &ParseError{"", "IPSECKEY " + err.Error(), l} } c.Next() // zBlank @@ -1297,14 +1272,14 @@ func (rr *AMTRELAY) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() num, err := strconv.ParseUint(l.token, 10, 8) if err != nil || l.err { - return &ParseError{err: "bad AMTRELAY value", lex: l} + return &ParseError{"", "bad AMTRELAY value", l} } rr.Precedence = uint8(num) c.Next() // zBlank l, _ = c.Next() if l.err || !(l.token == "0" || l.token == "1") { - return &ParseError{err: "bad discovery value", lex: l} + return &ParseError{"", "bad discovery value", l} } if l.token == "1" { rr.GatewayType = 0x80 @@ -1315,19 +1290,19 @@ func (rr *AMTRELAY) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() num, err = strconv.ParseUint(l.token, 10, 8) if err != nil || l.err { - return &ParseError{err: "bad AMTRELAY value", lex: l} + return &ParseError{"", "bad AMTRELAY value", l} } rr.GatewayType |= uint8(num) c.Next() // zBlank l, _ = c.Next() if l.err { - return &ParseError{err: "bad AMTRELAY gateway", lex: l} + return &ParseError{"", "bad AMTRELAY gateway", l} } rr.GatewayAddr, rr.GatewayHost, err = parseAddrHostUnion(l.token, o, rr.GatewayType&0x7f) if err != nil { - return &ParseError{wrappedErr: fmt.Errorf("AMTRELAY %w", err), lex: l} + return &ParseError{"", "AMTRELAY " + err.Error(), l} } return slurpRemainder(c) @@ -1363,21 +1338,21 @@ func (rr *RKEY) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{err: "bad RKEY Flags", lex: l} + return &ParseError{"", "bad RKEY Flags", l} } rr.Flags = uint16(i) c.Next() // zBlank l, _ = c.Next() // zString i, e1 := strconv.ParseUint(l.token, 10, 8) if e1 != nil || l.err { - return &ParseError{err: "bad RKEY Protocol", lex: l} + return &ParseError{"", "bad RKEY Protocol", l} } rr.Protocol = uint8(i) c.Next() // zBlank l, _ = c.Next() // zString i, e2 := strconv.ParseUint(l.token, 10, 8) if e2 != nil || l.err { - return &ParseError{err: "bad RKEY Algorithm", lex: l} + return &ParseError{"", "bad RKEY Algorithm", l} } rr.Algorithm = uint8(i) s, e3 := endingToString(c, "bad RKEY PublicKey") @@ -1410,21 +1385,21 @@ func (rr *GPOS) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() _, e := strconv.ParseFloat(l.token, 64) if e != nil || l.err { - return &ParseError{err: "bad GPOS Longitude", lex: l} + return &ParseError{"", "bad GPOS Longitude", l} } rr.Longitude = l.token c.Next() // zBlank l, _ = c.Next() _, e1 := strconv.ParseFloat(l.token, 64) if e1 != nil || l.err { - return &ParseError{err: "bad GPOS Latitude", lex: l} + return &ParseError{"", "bad GPOS Latitude", l} } rr.Latitude = l.token c.Next() // zBlank l, _ = c.Next() _, e2 := strconv.ParseFloat(l.token, 64) if e2 != nil || l.err { - return &ParseError{err: "bad GPOS Altitude", lex: l} + return &ParseError{"", "bad GPOS Altitude", l} } rr.Altitude = l.token return slurpRemainder(c) @@ -1434,7 +1409,7 @@ func (rr *DS) parseDS(c *zlexer, o, typ string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{err: "bad " + typ + " KeyTag", lex: l} + return &ParseError{"", "bad " + typ + " KeyTag", l} } rr.KeyTag = uint16(i) c.Next() // zBlank @@ -1443,7 +1418,7 @@ func (rr *DS) parseDS(c *zlexer, o, typ string) *ParseError { tokenUpper := strings.ToUpper(l.token) i, ok := StringToAlgorithm[tokenUpper] if !ok || l.err { - return &ParseError{err: "bad " + typ + " Algorithm", lex: l} + return &ParseError{"", "bad " + typ + " Algorithm", l} } rr.Algorithm = i } else { @@ -1453,7 +1428,7 @@ func (rr *DS) parseDS(c *zlexer, o, typ string) *ParseError { l, _ = c.Next() i, e1 := strconv.ParseUint(l.token, 10, 8) if e1 != nil || l.err { - return &ParseError{err: "bad " + typ + " DigestType", lex: l} + return &ParseError{"", "bad " + typ + " DigestType", l} } rr.DigestType = uint8(i) s, e2 := endingToString(c, "bad "+typ+" Digest") @@ -1468,7 +1443,7 @@ func (rr *TA) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{err: "bad TA KeyTag", lex: l} + return &ParseError{"", "bad TA KeyTag", l} } rr.KeyTag = uint16(i) c.Next() // zBlank @@ -1477,7 +1452,7 @@ func (rr *TA) parse(c *zlexer, o string) *ParseError { tokenUpper := strings.ToUpper(l.token) i, ok := StringToAlgorithm[tokenUpper] if !ok || l.err { - return &ParseError{err: "bad TA Algorithm", lex: l} + return &ParseError{"", "bad TA Algorithm", l} } rr.Algorithm = i } else { @@ -1487,7 +1462,7 @@ func (rr *TA) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() i, e1 := strconv.ParseUint(l.token, 10, 8) if e1 != nil || l.err { - return &ParseError{err: "bad TA DigestType", lex: l} + return &ParseError{"", "bad TA DigestType", l} } rr.DigestType = uint8(i) s, e2 := endingToString(c, "bad TA Digest") @@ -1502,21 +1477,21 @@ func (rr *TLSA) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{err: "bad TLSA Usage", lex: l} + return &ParseError{"", "bad TLSA Usage", l} } rr.Usage = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e1 := strconv.ParseUint(l.token, 10, 8) if e1 != nil || l.err { - return &ParseError{err: "bad TLSA Selector", lex: l} + return &ParseError{"", "bad TLSA Selector", l} } rr.Selector = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e2 := strconv.ParseUint(l.token, 10, 8) if e2 != nil || l.err { - return &ParseError{err: "bad TLSA MatchingType", lex: l} + return &ParseError{"", "bad TLSA MatchingType", l} } rr.MatchingType = uint8(i) // So this needs be e2 (i.e. different than e), because...??t @@ -1532,21 +1507,21 @@ func (rr *SMIMEA) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{err: "bad SMIMEA Usage", lex: l} + return &ParseError{"", "bad SMIMEA Usage", l} } rr.Usage = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e1 := strconv.ParseUint(l.token, 10, 8) if e1 != nil || l.err { - return &ParseError{err: "bad SMIMEA Selector", lex: l} + return &ParseError{"", "bad SMIMEA Selector", l} } rr.Selector = uint8(i) c.Next() // zBlank l, _ = c.Next() i, e2 := strconv.ParseUint(l.token, 10, 8) if e2 != nil || l.err { - return &ParseError{err: "bad SMIMEA MatchingType", lex: l} + return &ParseError{"", "bad SMIMEA MatchingType", l} } rr.MatchingType = uint8(i) // So this needs be e2 (i.e. different than e), because...??t @@ -1561,14 +1536,14 @@ func (rr *SMIMEA) parse(c *zlexer, o string) *ParseError { func (rr *RFC3597) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() if l.token != "\\#" { - return &ParseError{err: "bad RFC3597 Rdata", lex: l} + return &ParseError{"", "bad RFC3597 Rdata", l} } c.Next() // zBlank l, _ = c.Next() rdlength, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{err: "bad RFC3597 Rdata ", lex: l} + return &ParseError{"", "bad RFC3597 Rdata ", l} } s, e1 := endingToString(c, "bad RFC3597 Rdata") @@ -1576,7 +1551,7 @@ func (rr *RFC3597) parse(c *zlexer, o string) *ParseError { return e1 } if int(rdlength)*2 != len(s) { - return &ParseError{err: "bad RFC3597 Rdata", lex: l} + return &ParseError{"", "bad RFC3597 Rdata", l} } rr.Rdata = s return nil @@ -1624,14 +1599,14 @@ func (rr *URI) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{err: "bad URI Priority", lex: l} + return &ParseError{"", "bad URI Priority", l} } rr.Priority = uint16(i) c.Next() // zBlank l, _ = c.Next() i, e1 := strconv.ParseUint(l.token, 10, 16) if e1 != nil || l.err { - return &ParseError{err: "bad URI Weight", lex: l} + return &ParseError{"", "bad URI Weight", l} } rr.Weight = uint16(i) @@ -1641,7 +1616,7 @@ func (rr *URI) parse(c *zlexer, o string) *ParseError { return e2 } if len(s) != 1 { - return &ParseError{err: "bad URI Target", lex: l} + return &ParseError{"", "bad URI Target", l} } rr.Target = s[0] return nil @@ -1661,7 +1636,7 @@ func (rr *NID) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{err: "bad NID Preference", lex: l} + return &ParseError{"", "bad NID Preference", l} } rr.Preference = uint16(i) c.Next() // zBlank @@ -1678,14 +1653,14 @@ func (rr *L32) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{err: "bad L32 Preference", lex: l} + return &ParseError{"", "bad L32 Preference", l} } rr.Preference = uint16(i) c.Next() // zBlank l, _ = c.Next() // zString rr.Locator32 = net.ParseIP(l.token) if rr.Locator32 == nil || l.err { - return &ParseError{err: "bad L32 Locator", lex: l} + return &ParseError{"", "bad L32 Locator", l} } return slurpRemainder(c) } @@ -1694,7 +1669,7 @@ func (rr *LP) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{err: "bad LP Preference", lex: l} + return &ParseError{"", "bad LP Preference", l} } rr.Preference = uint16(i) @@ -1703,7 +1678,7 @@ func (rr *LP) parse(c *zlexer, o string) *ParseError { rr.Fqdn = l.token name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{err: "bad LP Fqdn", lex: l} + return &ParseError{"", "bad LP Fqdn", l} } rr.Fqdn = name return slurpRemainder(c) @@ -1713,7 +1688,7 @@ func (rr *L64) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{err: "bad L64 Preference", lex: l} + return &ParseError{"", "bad L64 Preference", l} } rr.Preference = uint16(i) c.Next() // zBlank @@ -1730,7 +1705,7 @@ func (rr *UID) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 32) if e != nil || l.err { - return &ParseError{err: "bad UID Uid", lex: l} + return &ParseError{"", "bad UID Uid", l} } rr.Uid = uint32(i) return slurpRemainder(c) @@ -1740,7 +1715,7 @@ func (rr *GID) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 32) if e != nil || l.err { - return &ParseError{err: "bad GID Gid", lex: l} + return &ParseError{"", "bad GID Gid", l} } rr.Gid = uint32(i) return slurpRemainder(c) @@ -1762,7 +1737,7 @@ func (rr *PX) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{err: "bad PX Preference", lex: l} + return &ParseError{"", "bad PX Preference", l} } rr.Preference = uint16(i) @@ -1771,7 +1746,7 @@ func (rr *PX) parse(c *zlexer, o string) *ParseError { rr.Map822 = l.token map822, map822Ok := toAbsoluteName(l.token, o) if l.err || !map822Ok { - return &ParseError{err: "bad PX Map822", lex: l} + return &ParseError{"", "bad PX Map822", l} } rr.Map822 = map822 @@ -1780,7 +1755,7 @@ func (rr *PX) parse(c *zlexer, o string) *ParseError { rr.Mapx400 = l.token mapx400, mapx400Ok := toAbsoluteName(l.token, o) if l.err || !mapx400Ok { - return &ParseError{err: "bad PX Mapx400", lex: l} + return &ParseError{"", "bad PX Mapx400", l} } rr.Mapx400 = mapx400 return slurpRemainder(c) @@ -1790,14 +1765,14 @@ func (rr *CAA) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{err: "bad CAA Flag", lex: l} + return &ParseError{"", "bad CAA Flag", l} } rr.Flag = uint8(i) c.Next() // zBlank l, _ = c.Next() // zString if l.value != zString { - return &ParseError{err: "bad CAA Tag", lex: l} + return &ParseError{"", "bad CAA Tag", l} } rr.Tag = l.token @@ -1807,7 +1782,7 @@ func (rr *CAA) parse(c *zlexer, o string) *ParseError { return e1 } if len(s) != 1 { - return &ParseError{err: "bad CAA Value", lex: l} + return &ParseError{"", "bad CAA Value", l} } rr.Value = s[0] return nil @@ -1818,7 +1793,7 @@ func (rr *TKEY) parse(c *zlexer, o string) *ParseError { // Algorithm if l.value != zString { - return &ParseError{err: "bad TKEY algorithm", lex: l} + return &ParseError{"", "bad TKEY algorithm", l} } rr.Algorithm = l.token c.Next() // zBlank @@ -1827,13 +1802,13 @@ func (rr *TKEY) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() i, e := strconv.ParseUint(l.token, 10, 8) if e != nil || l.err { - return &ParseError{err: "bad TKEY key length", lex: l} + return &ParseError{"", "bad TKEY key length", l} } rr.KeySize = uint16(i) c.Next() // zBlank l, _ = c.Next() if l.value != zString { - return &ParseError{err: "bad TKEY key", lex: l} + return &ParseError{"", "bad TKEY key", l} } rr.Key = l.token c.Next() // zBlank @@ -1842,13 +1817,13 @@ func (rr *TKEY) parse(c *zlexer, o string) *ParseError { l, _ = c.Next() i, e1 := strconv.ParseUint(l.token, 10, 8) if e1 != nil || l.err { - return &ParseError{err: "bad TKEY otherdata length", lex: l} + return &ParseError{"", "bad TKEY otherdata length", l} } rr.OtherLen = uint16(i) c.Next() // zBlank l, _ = c.Next() if l.value != zString { - return &ParseError{err: "bad TKEY otherday", lex: l} + return &ParseError{"", "bad TKEY otherday", l} } rr.OtherData = l.token return nil @@ -1866,14 +1841,14 @@ func (rr *APL) parse(c *zlexer, o string) *ParseError { continue } if l.value != zString { - return &ParseError{err: "unexpected APL field", lex: l} + return &ParseError{"", "unexpected APL field", l} } // Expected format: [!]afi:address/prefix colon := strings.IndexByte(l.token, ':') if colon == -1 { - return &ParseError{err: "missing colon in APL field", lex: l} + return &ParseError{"", "missing colon in APL field", l} } family, cidr := l.token[:colon], l.token[colon+1:] @@ -1886,7 +1861,7 @@ func (rr *APL) parse(c *zlexer, o string) *ParseError { afi, e := strconv.ParseUint(family, 10, 16) if e != nil { - return &ParseError{wrappedErr: fmt.Errorf("failed to parse APL family: %w", e), lex: l} + return &ParseError{"", "failed to parse APL family: " + e.Error(), l} } var addrLen int switch afi { @@ -1895,19 +1870,19 @@ func (rr *APL) parse(c *zlexer, o string) *ParseError { case 2: addrLen = net.IPv6len default: - return &ParseError{err: "unrecognized APL family", lex: l} + return &ParseError{"", "unrecognized APL family", l} } ip, subnet, e1 := net.ParseCIDR(cidr) if e1 != nil { - return &ParseError{wrappedErr: fmt.Errorf("failed to parse APL address: %w", e1), lex: l} + return &ParseError{"", "failed to parse APL address: " + e1.Error(), l} } if !ip.Equal(subnet.IP) { - return &ParseError{err: "extra bits in APL address", lex: l} + return &ParseError{"", "extra bits in APL address", l} } if len(subnet.IP) != addrLen { - return &ParseError{err: "address mismatch with the APL family", lex: l} + return &ParseError{"", "address mismatch with the APL family", l} } prefixes = append(prefixes, APLPrefix{ @@ -1919,39 +1894,3 @@ func (rr *APL) parse(c *zlexer, o string) *ParseError { rr.Prefixes = prefixes return nil } - -// escapedStringOffset finds the offset within a string (which may contain escape -// sequences) that corresponds to a certain byte offset. If the input offset is -// out of bounds, -1 is returned (which is *not* considered an error). -func escapedStringOffset(s string, desiredByteOffset int) (int, bool) { - if desiredByteOffset == 0 { - return 0, true - } - - currentByteOffset, i := 0, 0 - - for i < len(s) { - currentByteOffset += 1 - - // Skip escape sequences - if s[i] != '\\' { - // Single plain byte, not an escape sequence. - i++ - } else if isDDD(s[i+1:]) { - // Skip backslash and DDD. - i += 4 - } else if len(s[i+1:]) < 1 { - // No character following the backslash; that's an error. - return 0, false - } else { - // Skip backslash and following byte. - i += 2 - } - - if currentByteOffset >= desiredByteOffset { - return i, true - } - } - - return -1, true -} diff --git a/scan_test.go b/scan_test.go index c4f7e7f4a9..218c9750b1 100644 --- a/scan_test.go +++ b/scan_test.go @@ -1,14 +1,11 @@ package dns import ( - "errors" "io" - "io/fs" "net" "os" "strings" "testing" - "testing/fstest" ) func TestZoneParserGenerate(t *testing.T) { @@ -99,78 +96,6 @@ func TestZoneParserInclude(t *testing.T) { } } -func TestZoneParserIncludeFS(t *testing.T) { - fsys := fstest.MapFS{ - "db.foo": &fstest.MapFile{ - Data: []byte("foo\tIN\tA\t127.0.0.1"), - }, - } - zone := "$ORIGIN example.org.\n$INCLUDE db.foo\nbar\tIN\tA\t127.0.0.2" - - var got int - z := NewZoneParser(strings.NewReader(zone), "", "") - z.SetIncludeAllowed(true) - z.SetIncludeFS(fsys) - for rr, ok := z.Next(); ok; _, ok = z.Next() { - switch rr.Header().Name { - case "foo.example.org.", "bar.example.org.": - default: - t.Fatalf("expected foo.example.org. or bar.example.org., but got %s", rr.Header().Name) - } - got++ - } - if err := z.Err(); err != nil { - t.Fatalf("expected no error, but got %s", err) - } - - if expected := 2; got != expected { - t.Errorf("failed to parse zone after include, expected %d records, got %d", expected, got) - } - - fsys = fstest.MapFS{} - - z = NewZoneParser(strings.NewReader(zone), "", "") - z.SetIncludeAllowed(true) - z.SetIncludeFS(fsys) - z.Next() - if err := z.Err(); !errors.Is(err, fs.ErrNotExist) { - t.Fatalf(`expected fs.ErrNotExist but got: %T %v`, err, err) - } -} - -func TestZoneParserIncludeFSPaths(t *testing.T) { - fsys := fstest.MapFS{ - "baz/bat/db.foo": &fstest.MapFile{ - Data: []byte("foo\tIN\tA\t127.0.0.1"), - }, - } - - for _, p := range []string{ - "../bat/db.foo", - "/baz/bat/db.foo", - } { - zone := "$ORIGIN example.org.\n$INCLUDE " + p + "\nbar\tIN\tA\t127.0.0.2" - var got int - z := NewZoneParser(strings.NewReader(zone), "", "baz/quux/db.bar") - z.SetIncludeAllowed(true) - z.SetIncludeFS(fsys) - for rr, ok := z.Next(); ok; _, ok = z.Next() { - switch rr.Header().Name { - case "foo.example.org.", "bar.example.org.": - default: - t.Fatalf("$INCLUDE %q: expected foo.example.org. or bar.example.org., but got %s", p, rr.Header().Name) - } - got++ - } - if err := z.Err(); err != nil { - t.Fatalf("$INCLUDE %q: expected no error, but got %s", p, err) - } - if expected := 2; got != expected { - t.Errorf("$INCLUDE %q: failed to parse zone after include, expected %d records, got %d", p, expected, got) - } - } -} - func TestZoneParserIncludeDisallowed(t *testing.T) { tmpfile, err := os.CreateTemp("", "dns") if err != nil { @@ -359,15 +284,6 @@ func TestParseKnownRRAsRFC3597(t *testing.T) { }) } -func TestParseOpenEscape(t *testing.T) { - if _, err := NewRR("example.net IN CNAME example.net."); err != nil { - t.Fatalf("expected no error, but got: %s", err) - } - if _, err := NewRR("example.net IN CNAME example.org\\"); err == nil { - t.Fatalf("expected an error, but got none") - } -} - func BenchmarkNewRR(b *testing.B) { const name1 = "12345678901234567890123456789012345.12345678.123." const s = name1 + " 3600 IN MX 10 " + name1 @@ -427,43 +343,3 @@ func BenchmarkZoneParser(b *testing.B) { } } } - -func TestEscapedStringOffset(t *testing.T) { - var cases = []struct { - input string - inputOffset int - expectedOffset int - expectedOK bool - }{ - {"simple string with no escape sequences", 20, 20, true}, - {"simple string with no escape sequences", 500, -1, true}, - {`\;\088\\\;\120\\`, 0, 0, true}, - {`\;\088\\\;\120\\`, 1, 2, true}, - {`\;\088\\\;\120\\`, 2, 6, true}, - {`\;\088\\\;\120\\`, 3, 8, true}, - {`\;\088\\\;\120\\`, 4, 10, true}, - {`\;\088\\\;\120\\`, 5, 14, true}, - {`\;\088\\\;\120\\`, 6, 16, true}, - {`\;\088\\\;\120\\`, 7, -1, true}, - {`\`, 3, 0, false}, - {`a\`, 3, 0, false}, - {`aa\`, 3, 0, false}, - {`aaa\`, 3, 3, true}, - {`aaaa\`, 3, 3, true}, - } - for i, test := range cases { - outputOffset, outputOK := escapedStringOffset(test.input, test.inputOffset) - if outputOffset != test.expectedOffset { - t.Errorf( - "Test %d (input %#q offset %d) returned offset %d but expected %d", - i, test.input, test.inputOffset, outputOffset, test.expectedOffset, - ) - } - if outputOK != test.expectedOK { - t.Errorf( - "Test %d (input %#q offset %d) returned ok=%t but expected %t", - i, test.input, test.inputOffset, outputOK, test.expectedOK, - ) - } - } -} diff --git a/server.go b/server.go index 8cfb13419c..34c4e91c2a 100644 --- a/server.go +++ b/server.go @@ -201,14 +201,6 @@ type DecorateReader func(Reader) Reader // Implementations should never return a nil Writer. type DecorateWriter func(Writer) Writer -// MsgInvalidFunc is a listener hook for observing incoming messages that were discarded -// because they could not be parsed. -// Every message that is read by a Reader will eventually be provided to the Handler, -// rejected (or ignored) by the MsgAcceptFunc, or passed to this function. -type MsgInvalidFunc func(m []byte, err error) - -func DefaultMsgInvalidFunc(m []byte, err error) {} - // A Server defines parameters for running an DNS server. type Server struct { // Address to listen on, ":dns" if empty. @@ -254,8 +246,6 @@ type Server struct { // AcceptMsgFunc will check the incoming message and will reject it early in the process. // By default DefaultMsgAcceptFunc will be used. MsgAcceptFunc MsgAcceptFunc - // MsgInvalidFunc is optional, will be called if a message is received but cannot be parsed. - MsgInvalidFunc MsgInvalidFunc // Shutdown handling lock sync.RWMutex @@ -300,9 +290,6 @@ func (srv *Server) init() { if srv.MsgAcceptFunc == nil { srv.MsgAcceptFunc = DefaultMsgAcceptFunc } - if srv.MsgInvalidFunc == nil { - srv.MsgInvalidFunc = DefaultMsgInvalidFunc - } if srv.Handler == nil { srv.Handler = DefaultServeMux } @@ -557,7 +544,6 @@ func (srv *Server) serveUDP(l net.PacketConn) error { if cap(m) == srv.UDPSize { srv.udpPool.Put(m[:srv.UDPSize]) } - srv.MsgInvalidFunc(m, ErrShortRead) continue } wg.Add(1) @@ -638,7 +624,6 @@ func (srv *Server) serveUDPPacket(wg *sync.WaitGroup, m []byte, u net.PacketConn func (srv *Server) serveDNS(m []byte, w *response) { dh, off, err := unpackMsgHdr(m, 0) if err != nil { - srv.MsgInvalidFunc(m, err) // Let client hang, they are sending crap; any reply can be used to amplify. return } @@ -648,12 +633,10 @@ func (srv *Server) serveDNS(m []byte, w *response) { switch action := srv.MsgAcceptFunc(dh); action { case MsgAccept: - err := req.unpack(dh, m, off) - if err == nil { + if req.unpack(dh, m, off) == nil { break } - srv.MsgInvalidFunc(m, err) fallthrough case MsgReject, MsgRejectNotImplemented: opcode := req.Opcode diff --git a/server_test.go b/server_test.go index 4fc2af3291..aaaca70482 100644 --- a/server_test.go +++ b/server_test.go @@ -3,7 +3,6 @@ package dns import ( "context" "crypto/tls" - "errors" "fmt" "io" "net" @@ -1042,176 +1041,6 @@ func TestServerReuseport(t *testing.T) { } } -func TestServerReuseaddr(t *testing.T) { - startServerFn := func(t *testing.T, network, addr string, expectSuccess bool) (*Server, chan error) { - t.Helper() - wait := make(chan struct{}) - srv := &Server{ - Net: network, - Addr: addr, - NotifyStartedFunc: func() { close(wait) }, - ReuseAddr: true, - } - - fin := make(chan error, 1) - go func() { - fin <- srv.ListenAndServe() - }() - - select { - case <-wait: - case err := <-fin: - switch { - case expectSuccess: - t.Fatalf("%s: failed to start server: %v", t.Name(), err) - default: - fin <- err - return nil, fin - } - } - return srv, fin - } - - externalIPFn := func(t *testing.T) (string, error) { - t.Helper() - ifaces, err := net.Interfaces() - if err != nil { - return "", err - } - for _, iface := range ifaces { - if iface.Flags&net.FlagUp == 0 { - continue // interface down - } - if iface.Flags&net.FlagLoopback != 0 { - continue // loopback interface - } - addrs, err := iface.Addrs() - if err != nil { - return "", err - } - for _, addr := range addrs { - var ip net.IP - switch v := addr.(type) { - case *net.IPNet: - ip = v.IP - case *net.IPAddr: - ip = v.IP - } - if ip == nil || ip.IsLoopback() { - continue - } - ip = ip.To4() - if ip == nil { - continue // not an ipv4 address - } - return ip.String(), nil - } - } - return "", errors.New("are you connected to the network?") - } - - freePortFn := func(t *testing.T) int { - t.Helper() - addr, err := net.ResolveTCPAddr("tcp", "localhost:0") - if err != nil { - t.Fatalf("unable resolve tcp addr: %s", err) - } - - l, err := net.ListenTCP("tcp", addr) - if err != nil { - t.Fatalf("unable listen tcp: %s", err) - } - defer l.Close() - return l.Addr().(*net.TCPAddr).Port - } - - t.Run("should-fail-tcp", func(t *testing.T) { - // ReuseAddr should fail if you try to bind to exactly the same - // combination of source address and port. - // This should fail whether or not ReuseAddr is supported on a - // particular OS - ip, err := externalIPFn(t) - if err != nil { - t.Skip("no external IPs found") - return - } - port := freePortFn(t) - srv1, fin1 := startServerFn(t, "tcp", fmt.Sprintf("%s:%d", ip, port), true) - srv2, fin2 := startServerFn(t, "tcp", fmt.Sprintf("%s:%d", ip, port), false) - switch { - case srv2 != nil && srv2.started: - t.Fatalf("second ListenAndServe should not have started") - default: - if err := <-fin2; err == nil { - t.Fatalf("second ListenAndServe should have returned a startup error: %v", err) - } - } - - if err := srv1.Shutdown(); err != nil { - t.Fatalf("failed to shutdown first server: %v", err) - } - if err := <-fin1; err != nil { - t.Fatalf("first ListenAndServe returned error after Shutdown: %v", err) - } - }) - t.Run("should-succeed-tcp", func(t *testing.T) { - if !supportsReuseAddr { - t.Skip("reuseaddr is not supported") - } - ip, err := externalIPFn(t) - if err != nil { - t.Skip("no external IPs found") - return - } - port := freePortFn(t) - - // ReuseAddr should succeed if you try to bind to the same port but a different source address - srv1, fin1 := startServerFn(t, "tcp", fmt.Sprintf("localhost:%d", port), true) - srv2, fin2 := startServerFn(t, "tcp", fmt.Sprintf("%s:%d", ip, port), true) - - if err := srv1.Shutdown(); err != nil { - t.Fatalf("failed to shutdown first server: %v", err) - } - if err := srv2.Shutdown(); err != nil { - t.Fatalf("failed to shutdown second server: %v", err) - } - if err := <-fin1; err != nil { - t.Fatalf("first ListenAndServe returned error after Shutdown: %v", err) - } - if err := <-fin2; err != nil { - t.Fatalf("second ListenAndServe returned error after Shutdown: %v", err) - } - }) - t.Run("should-succeed-udp", func(t *testing.T) { - if !supportsReuseAddr { - t.Skip("reuseaddr is not supported") - } - ip, err := externalIPFn(t) - if err != nil { - t.Skip("no external IPs found") - return - } - port := freePortFn(t) - - // ReuseAddr should succeed if you try to bind to the same port but a different source address - srv1, fin1 := startServerFn(t, "udp", fmt.Sprintf("localhost:%d", port), true) - srv2, fin2 := startServerFn(t, "udp", fmt.Sprintf("%s:%d", ip, port), true) - - if err := srv1.Shutdown(); err != nil { - t.Fatalf("failed to shutdown first server: %v", err) - } - if err := srv2.Shutdown(); err != nil { - t.Fatalf("failed to shutdown second server: %v", err) - } - if err := <-fin1; err != nil { - t.Fatalf("first ListenAndServe returned error after Shutdown: %v", err) - } - if err := <-fin2; err != nil { - t.Fatalf("second ListenAndServe returned error after Shutdown: %v", err) - } - }) -} - func TestServerRoundtripTsig(t *testing.T) { secret := map[string]string{"test.": "so6ZGir4GPAqINNh9U5c3A=="} diff --git a/svcb.go b/svcb.go index 310c7d11f5..d38aa2f05c 100644 --- a/svcb.go +++ b/svcb.go @@ -14,7 +14,7 @@ import ( // SVCBKey is the type of the keys used in the SVCB RR. type SVCBKey uint16 -// Keys defined in rfc9460 +// Keys defined in draft-ietf-dnsop-svcb-https-08 Section 14.3.2. const ( SVCB_MANDATORY SVCBKey = iota SVCB_ALPN @@ -23,8 +23,7 @@ const ( SVCB_IPV4HINT SVCB_ECHCONFIG SVCB_IPV6HINT - SVCB_DOHPATH // rfc9461 Section 5 - SVCB_OHTTP // rfc9540 Section 8 + SVCB_DOHPATH // draft-ietf-add-svcb-dns-02 Section 9 svcb_RESERVED SVCBKey = 65535 ) @@ -38,7 +37,6 @@ var svcbKeyToStringMap = map[SVCBKey]string{ SVCB_ECHCONFIG: "ech", SVCB_IPV6HINT: "ipv6hint", SVCB_DOHPATH: "dohpath", - SVCB_OHTTP: "ohttp", } var svcbStringToKeyMap = reverseSVCBKeyMap(svcbKeyToStringMap) @@ -87,7 +85,7 @@ func (rr *SVCB) parse(c *zlexer, o string) *ParseError { l, _ := c.Next() i, e := strconv.ParseUint(l.token, 10, 16) if e != nil || l.err { - return &ParseError{file: l.token, err: "bad SVCB priority", lex: l} + return &ParseError{l.token, "bad SVCB priority", l} } rr.Priority = uint16(i) @@ -97,7 +95,7 @@ func (rr *SVCB) parse(c *zlexer, o string) *ParseError { name, nameOk := toAbsoluteName(l.token, o) if l.err || !nameOk { - return &ParseError{file: l.token, err: "bad SVCB Target", lex: l} + return &ParseError{l.token, "bad SVCB Target", l} } rr.Target = name @@ -113,7 +111,7 @@ func (rr *SVCB) parse(c *zlexer, o string) *ParseError { if !canHaveNextKey { // The key we can now read was probably meant to be // a part of the last value. - return &ParseError{file: l.token, err: "bad SVCB value quotation", lex: l} + return &ParseError{l.token, "bad SVCB value quotation", l} } // In key=value pairs, value does not have to be quoted unless value @@ -126,7 +124,7 @@ func (rr *SVCB) parse(c *zlexer, o string) *ParseError { // Key with no value and no equality sign key = l.token } else if idx == 0 { - return &ParseError{file: l.token, err: "bad SVCB key", lex: l} + return &ParseError{l.token, "bad SVCB key", l} } else { key, value = l.token[:idx], l.token[idx+1:] @@ -146,30 +144,30 @@ func (rr *SVCB) parse(c *zlexer, o string) *ParseError { value = l.token l, _ = c.Next() if l.value != zQuote { - return &ParseError{file: l.token, err: "SVCB unterminated value", lex: l} + return &ParseError{l.token, "SVCB unterminated value", l} } case zQuote: // There's nothing in double quotes. default: - return &ParseError{file: l.token, err: "bad SVCB value", lex: l} + return &ParseError{l.token, "bad SVCB value", l} } } } } kv := makeSVCBKeyValue(svcbStringToKey(key)) if kv == nil { - return &ParseError{file: l.token, err: "bad SVCB key", lex: l} + return &ParseError{l.token, "bad SVCB key", l} } if err := kv.parse(value); err != nil { - return &ParseError{file: l.token, wrappedErr: err, lex: l} + return &ParseError{l.token, err.Error(), l} } xs = append(xs, kv) case zQuote: - return &ParseError{file: l.token, err: "SVCB key can't contain double quotes", lex: l} + return &ParseError{l.token, "SVCB key can't contain double quotes", l} case zBlank: canHaveNextKey = true default: - return &ParseError{file: l.token, err: "bad SVCB values", lex: l} + return &ParseError{l.token, "bad SVCB values", l} } l, _ = c.Next() } @@ -203,8 +201,6 @@ func makeSVCBKeyValue(key SVCBKey) SVCBKeyValue { return new(SVCBIPv6Hint) case SVCB_DOHPATH: return new(SVCBDoHPath) - case SVCB_OHTTP: - return new(SVCBOhttp) case svcb_RESERVED: return nil default: @@ -775,8 +771,8 @@ func (s *SVCBIPv6Hint) copy() SVCBKeyValue { // SVCBDoHPath pair is used to indicate the URI template that the // clients may use to construct a DNS over HTTPS URI. // -// See RFC 9461 (https://datatracker.ietf.org/doc/html/rfc9461) -// and RFC 9462 (https://datatracker.ietf.org/doc/html/rfc9462). +// See RFC xxxx (https://datatracker.ietf.org/doc/html/draft-ietf-add-svcb-dns-02) +// and RFC yyyy (https://datatracker.ietf.org/doc/html/draft-ietf-add-ddr-06). // // A basic example of using the dohpath option together with the alpn // option to indicate support for DNS over HTTPS on a certain path: @@ -820,44 +816,6 @@ func (s *SVCBDoHPath) copy() SVCBKeyValue { } } -// The "ohttp" SvcParamKey is used to indicate that a service described in a SVCB RR -// can be accessed as a target using an associated gateway. -// Both the presentation and wire-format values for the "ohttp" parameter MUST be empty. -// -// See RFC 9460 (https://datatracker.ietf.org/doc/html/rfc9460/) -// and RFC 9230 (https://datatracker.ietf.org/doc/html/rfc9230/) -// -// A basic example of using the dohpath option together with the alpn -// option to indicate support for DNS over HTTPS on a certain path: -// -// s := new(dns.SVCB) -// s.Hdr = dns.RR_Header{Name: ".", Rrtype: dns.TypeSVCB, Class: dns.ClassINET} -// e := new(dns.SVCBAlpn) -// e.Alpn = []string{"h2", "h3"} -// p := new(dns.SVCBOhttp) -// s.Value = append(s.Value, e, p) -type SVCBOhttp struct{} - -func (*SVCBOhttp) Key() SVCBKey { return SVCB_OHTTP } -func (*SVCBOhttp) copy() SVCBKeyValue { return &SVCBOhttp{} } -func (*SVCBOhttp) pack() ([]byte, error) { return []byte{}, nil } -func (*SVCBOhttp) String() string { return "" } -func (*SVCBOhttp) len() int { return 0 } - -func (*SVCBOhttp) unpack(b []byte) error { - if len(b) != 0 { - return errors.New("dns: svcbotthp: svcbotthp must have no value") - } - return nil -} - -func (*SVCBOhttp) parse(b string) error { - if b != "" { - return errors.New("dns: svcbotthp: svcbotthp must have no value") - } - return nil -} - // SVCBLocal pair is intended for experimental/private use. The key is recommended // to be in the range [SVCB_PRIVATE_LOWER, SVCB_PRIVATE_UPPER]. // Basic use pattern for creating a keyNNNNN option: diff --git a/svcb_test.go b/svcb_test.go index a96a344b6d..63a40102c7 100644 --- a/svcb_test.go +++ b/svcb_test.go @@ -24,7 +24,6 @@ func TestSVCB(t *testing.T) { {`key65002`, ``}, {`key65003`, `=\"\"`}, {`key65004`, `\254\ \ \030\000`}, - {`ohttp`, ``}, } for _, o := range svcbs { @@ -87,10 +86,6 @@ func TestDecodeBadSVCB(t *testing.T) { key: SVCB_IPV6HINT, data: []byte{0, 0, 0}, }, - { - key: SVCB_OHTTP, - data: []byte{0}, - }, } for _, o := range svcbs { err := makeSVCBKeyValue(SVCBKey(o.key)).unpack(o.data) diff --git a/types.go b/types.go index 8e3129cbd2..c9a03dec6d 100644 --- a/types.go +++ b/types.go @@ -135,8 +135,8 @@ const ( RcodeNXRrset = 8 // NXRRSet - RR Set that should exist does not [DNS Update] RcodeNotAuth = 9 // NotAuth - Server Not Authoritative for zone [DNS Update] RcodeNotZone = 10 // NotZone - Name not contained in zone [DNS Update/TSIG] - RcodeBadSig = 16 // BADSIG - TSIG Signature Failure [TSIG] https://www.rfc-editor.org/rfc/rfc6895.html#section-2.3 - RcodeBadVers = 16 // BADVERS - Bad OPT Version [EDNS0] https://www.rfc-editor.org/rfc/rfc6895.html#section-2.3 + RcodeBadSig = 16 // BADSIG - TSIG Signature Failure [TSIG] + RcodeBadVers = 16 // BADVERS - Bad OPT Version [EDNS0] RcodeBadKey = 17 // BADKEY - Key not recognized [TSIG] RcodeBadTime = 18 // BADTIME - Signature out of time window [TSIG] RcodeBadMode = 19 // BADMODE - Bad TKEY Mode [TKEY] @@ -402,17 +402,6 @@ func (rr *X25) String() string { return rr.Hdr.String() + rr.PSDNAddress } -// ISDN RR. See RFC 1183, Section 3.2. -type ISDN struct { - Hdr RR_Header - Address string - SubAddress string -} - -func (rr *ISDN) String() string { - return rr.Hdr.String() + sprintTxt([]string{rr.Address, rr.SubAddress}) -} - // RT RR. See RFC 1183, Section 3.3. type RT struct { Hdr RR_Header @@ -797,7 +786,7 @@ func (rr *GPOS) String() string { return rr.Hdr.String() + rr.Longitude + " " + rr.Latitude + " " + rr.Altitude } -// LOC RR. See RFC 1876. +// LOC RR. See RFC RFC 1876. type LOC struct { Hdr RR_Header Version uint8 @@ -909,11 +898,6 @@ func (rr *RRSIG) String() string { return s } -// NXT RR. See RFC 2535. -type NXT struct { - NSEC -} - // NSEC RR. See RFC 4034 and RFC 3755. type NSEC struct { Hdr RR_Header @@ -998,7 +982,7 @@ func (rr *TALINK) String() string { sprintName(rr.PreviousName) + " " + sprintName(rr.NextName) } -// SSHFP RR. See RFC 4255. +// SSHFP RR. See RFC RFC 4255. type SSHFP struct { Hdr RR_Header Algorithm uint8 @@ -1012,7 +996,7 @@ func (rr *SSHFP) String() string { " " + strings.ToUpper(rr.FingerPrint) } -// KEY RR. See RFC 2535. +// KEY RR. See RFC RFC 2535. type KEY struct { DNSKEY } @@ -1322,7 +1306,7 @@ type NINFO struct { func (rr *NINFO) String() string { return rr.Hdr.String() + sprintTxt(rr.ZSData) } -// NID RR. See RFC 6742. +// NID RR. See RFC RFC 6742. type NID struct { Hdr RR_Header Preference uint16 diff --git a/version.go b/version.go index dc34e5902b..a091136629 100644 --- a/version.go +++ b/version.go @@ -3,7 +3,7 @@ package dns import "fmt" // Version is current version of this library. -var Version = v{1, 1, 58} +var Version = v{1, 1, 56} // v holds the version of this library. type v struct { diff --git a/xfr.go b/xfr.go index 5cfbb516af..0a831c8805 100644 --- a/xfr.go +++ b/xfr.go @@ -1,7 +1,6 @@ package dns import ( - "crypto/tls" "fmt" "time" ) @@ -21,7 +20,6 @@ type Transfer struct { TsigProvider TsigProvider // An implementation of the TsigProvider interface. If defined it replaces TsigSecret and is used for all TSIG operations. TsigSecret map[string]string // Secret(s) for Tsig map[], zonename must be in canonical form (lowercase, fqdn, see RFC 4034 Section 6.2) tsigTimersOnly bool - TLS *tls.Config // TLS config. If Xfr over TLS will be attempted } func (t *Transfer) tsigProvider() TsigProvider { @@ -59,11 +57,7 @@ func (t *Transfer) In(q *Msg, a string) (env chan *Envelope, err error) { } if t.Conn == nil { - if t.TLS != nil { - t.Conn, err = DialTimeoutWithTLS("tcp-tls", a, t.TLS, timeout) - } else { - t.Conn, err = DialTimeout("tcp", a, timeout) - } + t.Conn, err = DialTimeout("tcp", a, timeout) if err != nil { return nil, err } @@ -86,13 +80,8 @@ func (t *Transfer) In(q *Msg, a string) (env chan *Envelope, err error) { func (t *Transfer) inAxfr(q *Msg, c chan *Envelope) { first := true - defer func() { - // First close the connection, then the channel. This allows functions blocked on - // the channel to assume that the connection is closed and no further operations are - // pending when they resume. - t.Close() - close(c) - }() + defer t.Close() + defer close(c) timeout := dnsTimeout if t.ReadTimeout != 0 { timeout = t.ReadTimeout @@ -142,13 +131,8 @@ func (t *Transfer) inIxfr(q *Msg, c chan *Envelope) { axfr := true n := 0 qser := q.Ns[0].(*SOA).Serial - defer func() { - // First close the connection, then the channel. This allows functions blocked on - // the channel to assume that the connection is closed and no further operations are - // pending when they resume. - t.Close() - close(c) - }() + defer t.Close() + defer close(c) timeout := dnsTimeout if t.ReadTimeout != 0 { timeout = t.ReadTimeout @@ -188,7 +172,7 @@ func (t *Transfer) inIxfr(q *Msg, c chan *Envelope) { if v, ok := rr.(*SOA); ok { if v.Serial == serial { n++ - // quit if it's a full axfr or the servers' SOA is repeated the third time + // quit if it's a full axfr or the the servers' SOA is repeated the third time if axfr && n == 2 || n == 3 { c <- &Envelope{in.Answer, nil} return @@ -209,7 +193,6 @@ func (t *Transfer) inIxfr(q *Msg, c chan *Envelope) { // ch := make(chan *dns.Envelope) // tr := new(dns.Transfer) // var wg sync.WaitGroup -// wg.Add(1) // go func() { // tr.Out(w, r, ch) // wg.Done() diff --git a/xfr_test.go b/xfr_test.go index 04801a2ec6..f6c5e98ccf 100644 --- a/xfr_test.go +++ b/xfr_test.go @@ -1,7 +1,6 @@ package dns import ( - "crypto/tls" "testing" "time" ) @@ -88,27 +87,6 @@ func TestSingleEnvelopeXfr(t *testing.T) { axfrTestingSuite(t, addrstr) } -func TestSingleEnvelopeXfrTLS(t *testing.T) { - HandleFunc("miek.nl.", SingleEnvelopeXfrServer) - defer HandleRemove("miek.nl.") - - cert, err := tls.X509KeyPair(CertPEMBlock, KeyPEMBlock) - if err != nil { - t.Fatalf("unable to build certificate: %v", err) - } - - tlsConfig := tls.Config{ - Certificates: []tls.Certificate{cert}, - } - s, addrstr, _, err := RunLocalTLSServer(":0", &tlsConfig) - if err != nil { - t.Fatalf("unable to run test server: %s", err) - } - defer s.Shutdown() - - axfrTestingSuiteTLS(t, addrstr) -} - func TestMultiEnvelopeXfr(t *testing.T) { HandleFunc("miek.nl.", MultipleEnvelopeXfrServer) defer HandleRemove("miek.nl.") @@ -153,38 +131,6 @@ func axfrTestingSuite(t *testing.T, addrstr string) { } } -func axfrTestingSuiteTLS(t *testing.T, addrstr string) { - tr := new(Transfer) - m := new(Msg) - m.SetAxfr("miek.nl.") - - tr.TLS = &tls.Config{ - InsecureSkipVerify: true, - } - c, err := tr.In(m, addrstr) - if err != nil { - t.Fatal("failed to zone transfer in", err) - } - - var records []RR - for msg := range c { - if msg.Error != nil { - t.Fatal(msg.Error) - } - records = append(records, msg.RR...) - } - - if len(records) != len(xfrTestData) { - t.Fatalf("bad axfr: expected %v, got %v", records, xfrTestData) - } - - for i, rr := range records { - if !IsDuplicate(rr, xfrTestData[i]) { - t.Fatalf("bad axfr: expected %v, got %v", records, xfrTestData) - } - } -} - func axfrTestingSuiteWithCustomTsig(t *testing.T, addrstr string, provider TsigProvider) { tr := new(Transfer) m := new(Msg) diff --git a/zduplicate.go b/zduplicate.go index 03029fb3eb..450bbbc29d 100644 --- a/zduplicate.go +++ b/zduplicate.go @@ -481,21 +481,6 @@ func (r1 *IPSECKEY) isDuplicate(_r2 RR) bool { return true } -func (r1 *ISDN) isDuplicate(_r2 RR) bool { - r2, ok := _r2.(*ISDN) - if !ok { - return false - } - _ = r2 - if r1.Address != r2.Address { - return false - } - if r1.SubAddress != r2.SubAddress { - return false - } - return true -} - func (r1 *KEY) isDuplicate(_r2 RR) bool { r2, ok := _r2.(*KEY) if !ok { @@ -886,26 +871,6 @@ func (r1 *NULL) isDuplicate(_r2 RR) bool { return true } -func (r1 *NXT) isDuplicate(_r2 RR) bool { - r2, ok := _r2.(*NXT) - if !ok { - return false - } - _ = r2 - if !isDuplicateName(r1.NextDomain, r2.NextDomain) { - return false - } - if len(r1.TypeBitMap) != len(r2.TypeBitMap) { - return false - } - for i := 0; i < len(r1.TypeBitMap); i++ { - if r1.TypeBitMap[i] != r2.TypeBitMap[i] { - return false - } - } - return true -} - func (r1 *OPENPGPKEY) isDuplicate(_r2 RR) bool { r2, ok := _r2.(*OPENPGPKEY) if !ok { diff --git a/zmsg.go b/zmsg.go index 39b3bc8102..3ea0eb423a 100644 --- a/zmsg.go +++ b/zmsg.go @@ -372,18 +372,6 @@ func (rr *IPSECKEY) pack(msg []byte, off int, compression compressionMap, compre return off, nil } -func (rr *ISDN) pack(msg []byte, off int, compression compressionMap, compress bool) (off1 int, err error) { - off, err = packString(rr.Address, msg, off) - if err != nil { - return off, err - } - off, err = packString(rr.SubAddress, msg, off) - if err != nil { - return off, err - } - return off, nil -} - func (rr *KEY) pack(msg []byte, off int, compression compressionMap, compress bool) (off1 int, err error) { off, err = packUint16(rr.Flags, msg, off) if err != nil { @@ -706,18 +694,6 @@ func (rr *NULL) pack(msg []byte, off int, compression compressionMap, compress b return off, nil } -func (rr *NXT) pack(msg []byte, off int, compression compressionMap, compress bool) (off1 int, err error) { - off, err = packDomainName(rr.NextDomain, msg, off, compression, false) - if err != nil { - return off, err - } - off, err = packDataNsec(rr.TypeBitMap, msg, off) - if err != nil { - return off, err - } - return off, nil -} - func (rr *OPENPGPKEY) pack(msg []byte, off int, compression compressionMap, compress bool) (off1 int, err error) { off, err = packStringBase64(rr.PublicKey, msg, off) if err != nil { @@ -1770,24 +1746,6 @@ func (rr *IPSECKEY) unpack(msg []byte, off int) (off1 int, err error) { return off, nil } -func (rr *ISDN) unpack(msg []byte, off int) (off1 int, err error) { - rdStart := off - _ = rdStart - - rr.Address, off, err = unpackString(msg, off) - if err != nil { - return off, err - } - if off == len(msg) { - return off, nil - } - rr.SubAddress, off, err = unpackString(msg, off) - if err != nil { - return off, err - } - return off, nil -} - func (rr *KEY) unpack(msg []byte, off int) (off1 int, err error) { rdStart := off _ = rdStart @@ -2266,24 +2224,6 @@ func (rr *NULL) unpack(msg []byte, off int) (off1 int, err error) { return off, nil } -func (rr *NXT) unpack(msg []byte, off int) (off1 int, err error) { - rdStart := off - _ = rdStart - - rr.NextDomain, off, err = UnpackDomainName(msg, off) - if err != nil { - return off, err - } - if off == len(msg) { - return off, nil - } - rr.TypeBitMap, off, err = unpackDataNsec(msg, off) - if err != nil { - return off, err - } - return off, nil -} - func (rr *OPENPGPKEY) unpack(msg []byte, off int) (off1 int, err error) { rdStart := off _ = rdStart diff --git a/ztypes.go b/ztypes.go index 2c70fc44d6..1b6f43200f 100644 --- a/ztypes.go +++ b/ztypes.go @@ -36,7 +36,6 @@ var TypeToRR = map[uint16]func() RR{ TypeHIP: func() RR { return new(HIP) }, TypeHTTPS: func() RR { return new(HTTPS) }, TypeIPSECKEY: func() RR { return new(IPSECKEY) }, - TypeISDN: func() RR { return new(ISDN) }, TypeKEY: func() RR { return new(KEY) }, TypeKX: func() RR { return new(KX) }, TypeL32: func() RR { return new(L32) }, @@ -60,7 +59,6 @@ var TypeToRR = map[uint16]func() RR{ TypeNSEC3: func() RR { return new(NSEC3) }, TypeNSEC3PARAM: func() RR { return new(NSEC3PARAM) }, TypeNULL: func() RR { return new(NULL) }, - TypeNXT: func() RR { return new(NXT) }, TypeOPENPGPKEY: func() RR { return new(OPENPGPKEY) }, TypeOPT: func() RR { return new(OPT) }, TypePTR: func() RR { return new(PTR) }, @@ -206,7 +204,6 @@ func (rr *HINFO) Header() *RR_Header { return &rr.Hdr } func (rr *HIP) Header() *RR_Header { return &rr.Hdr } func (rr *HTTPS) Header() *RR_Header { return &rr.Hdr } func (rr *IPSECKEY) Header() *RR_Header { return &rr.Hdr } -func (rr *ISDN) Header() *RR_Header { return &rr.Hdr } func (rr *KEY) Header() *RR_Header { return &rr.Hdr } func (rr *KX) Header() *RR_Header { return &rr.Hdr } func (rr *L32) Header() *RR_Header { return &rr.Hdr } @@ -230,7 +227,6 @@ func (rr *NSEC) Header() *RR_Header { return &rr.Hdr } func (rr *NSEC3) Header() *RR_Header { return &rr.Hdr } func (rr *NSEC3PARAM) Header() *RR_Header { return &rr.Hdr } func (rr *NULL) Header() *RR_Header { return &rr.Hdr } -func (rr *NXT) Header() *RR_Header { return &rr.Hdr } func (rr *OPENPGPKEY) Header() *RR_Header { return &rr.Hdr } func (rr *OPT) Header() *RR_Header { return &rr.Hdr } func (rr *PTR) Header() *RR_Header { return &rr.Hdr } @@ -441,13 +437,6 @@ func (rr *IPSECKEY) len(off int, compression map[string]struct{}) int { return l } -func (rr *ISDN) len(off int, compression map[string]struct{}) int { - l := rr.Hdr.len(off, compression) - l += len(rr.Address) + 1 - l += len(rr.SubAddress) + 1 - return l -} - func (rr *KX) len(off int, compression map[string]struct{}) int { l := rr.Hdr.len(off, compression) l += 2 // Preference @@ -977,10 +966,6 @@ func (rr *IPSECKEY) copy() RR { } } -func (rr *ISDN) copy() RR { - return &ISDN{rr.Hdr, rr.Address, rr.SubAddress} -} - func (rr *KEY) copy() RR { return &KEY{*rr.DNSKEY.copy().(*DNSKEY)} } @@ -1107,10 +1092,6 @@ func (rr *NULL) copy() RR { return &NULL{rr.Hdr, rr.Data} } -func (rr *NXT) copy() RR { - return &NXT{*rr.NSEC.copy().(*NSEC)} -} - func (rr *OPENPGPKEY) copy() RR { return &OPENPGPKEY{rr.Hdr, rr.PublicKey} }