From cbb9881e9670d493b3bfdb4ab1caf36ea8412209 Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Sat, 30 Aug 2014 07:34:05 +0100 Subject: [PATCH] Parse dynamic update RR in presentation format Don't panic when encountering dynamic update RRs in zonefiles. There are some other failure cases when parsing, those will be fixed in subsequent commits. Closes #110 --- parse_test.go | 5 ++--- zscan_rr.go | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/parse_test.go b/parse_test.go index f24910ba..1ee20a95 100644 --- a/parse_test.go +++ b/parse_test.go @@ -1173,6 +1173,7 @@ func TestTxtLong(t *testing.T) { } } +// Basically, don't crash. func TestMalformedPackets(t *testing.T) { var packets = []string{ "0021641c0000000100000000000078787878787878787878787303636f6d0000100001", @@ -1192,9 +1193,7 @@ func TestMalformedPackets(t *testing.T) { func TestDynamicUpdateParsing(t *testing.T) { prefix := "example.com. IN " - // TODO(miek): extend to all types. - //for _, typ := range TypeToString { - for _, typ := range []string{"PTR", "A"} { + for _, typ := range TypeToString { r, e := NewRR(prefix + typ) if e != nil { t.Log("failure to parse: " + prefix + typ) diff --git a/zscan_rr.go b/zscan_rr.go index 30dbb500..e5bcbfef 100644 --- a/zscan_rr.go +++ b/zscan_rr.go @@ -296,6 +296,9 @@ func setNS(h RR_Header, c chan lex, o, f string) (RR, *ParseError) { l := <-c rr.Ns = l.token + if l.length == 0 { + return rr, nil + } if l.token == "@" { rr.Ns = o return rr, nil @@ -339,6 +342,9 @@ func setNSAPPTR(h RR_Header, c chan lex, o, f string) (RR, *ParseError) { l := <-c rr.Ptr = l.token + if l.length == 0 { + return rr, nil + } if l.token == "@" { rr.Ptr = o return rr, nil @@ -359,6 +365,9 @@ func setRP(h RR_Header, c chan lex, o, f string) (RR, *ParseError) { l := <-c rr.Mbox = l.token + if l.length == 0 { + return rr, nil + } if l.token == "@" { rr.Mbox = o } else { @@ -393,6 +402,9 @@ func setMR(h RR_Header, c chan lex, o, f string) (RR, *ParseError) { l := <-c rr.Mr = l.token + if l.length == 0 { + return rr, nil + } if l.token == "@" { rr.Mr = o return rr, nil @@ -413,6 +425,9 @@ func setMB(h RR_Header, c chan lex, o, f string) (RR, *ParseError) { l := <-c rr.Mb = l.token + if l.length == 0 { + return rr, nil + } if l.token == "@" { rr.Mb = o return rr, nil @@ -433,6 +448,9 @@ func setMG(h RR_Header, c chan lex, o, f string) (RR, *ParseError) { l := <-c rr.Mg = l.token + if l.length == 0 { + return rr, nil + } if l.token == "@" { rr.Mg = o return rr, nil @@ -466,6 +484,9 @@ func setMINFO(h RR_Header, c chan lex, o, f string) (RR, *ParseError) { l := <-c rr.Rmail = l.token + if l.length == 0 { + return rr, nil + } if l.token == "@" { rr.Rmail = o } else { @@ -500,6 +521,9 @@ func setMF(h RR_Header, c chan lex, o, f string) (RR, *ParseError) { l := <-c rr.Mf = l.token + if l.length == 0 { + return rr, nil + } if l.token == "@" { rr.Mf = o return rr, nil @@ -520,6 +544,9 @@ func setMD(h RR_Header, c chan lex, o, f string) (RR, *ParseError) { l := <-c rr.Md = l.token + if l.length == 0 { + return rr, nil + } if l.token == "@" { rr.Md = o return rr, nil @@ -657,6 +684,9 @@ func setCNAME(h RR_Header, c chan lex, o, f string) (RR, *ParseError) { l := <-c rr.Target = l.token + if l.length == 0 { + return rr, nil + } if l.token == "@" { rr.Target = o return rr, nil @@ -677,6 +707,9 @@ func setDNAME(h RR_Header, c chan lex, o, f string) (RR, *ParseError) { l := <-c rr.Target = l.token + if l.length == 0 { + return rr, nil + } if l.token == "@" { rr.Target = o return rr, nil @@ -697,6 +730,9 @@ func setSOA(h RR_Header, c chan lex, o, f string) (RR, *ParseError) { l := <-c rr.Ns = l.token + if l.length == 0 { + return rr, nil + } <-c // _BLANK if l.token == "@" { rr.Ns = o @@ -901,6 +937,9 @@ func setTALINK(h RR_Header, c chan lex, o, f string) (RR, *ParseError) { l := <-c rr.PreviousName = l.token + if l.length == 0 { + return rr, nil + } if l.token == "@" { rr.PreviousName = o } else { @@ -1247,6 +1286,9 @@ func setNSEC(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) { l := <-c rr.NextDomain = l.token + if l.length == 0 { + return rr, nil, l.comment + } if l.token == "@" { rr.NextDomain = o } else { @@ -2004,6 +2046,9 @@ func setLP(h RR_Header, c chan lex, o, f string) (RR, *ParseError) { <-c // _BLANK l = <-c // _STRING rr.Fqdn = l.token + if l.length == 0 { + return rr, nil + } if l.token == "@" { rr.Fqdn = o return rr, nil @@ -2086,6 +2131,9 @@ func setPX(h RR_Header, c chan lex, o, f string) (RR, *ParseError) { <-c // _BLANK l = <-c // _STRING rr.Map822 = l.token + if l.length == 0 { + return rr, nil + } if l.token == "@" { rr.Map822 = o return rr, nil