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
This commit is contained in:
Miek Gieben 2014-08-30 07:34:05 +01:00
parent a2ad8f8ac5
commit cbb9881e96
2 changed files with 50 additions and 3 deletions

View File

@ -1173,6 +1173,7 @@ func TestTxtLong(t *testing.T) {
} }
} }
// Basically, don't crash.
func TestMalformedPackets(t *testing.T) { func TestMalformedPackets(t *testing.T) {
var packets = []string{ var packets = []string{
"0021641c0000000100000000000078787878787878787878787303636f6d0000100001", "0021641c0000000100000000000078787878787878787878787303636f6d0000100001",
@ -1192,9 +1193,7 @@ func TestMalformedPackets(t *testing.T) {
func TestDynamicUpdateParsing(t *testing.T) { func TestDynamicUpdateParsing(t *testing.T) {
prefix := "example.com. IN " prefix := "example.com. IN "
// TODO(miek): extend to all types. for _, typ := range TypeToString {
//for _, typ := range TypeToString {
for _, typ := range []string{"PTR", "A"} {
r, e := NewRR(prefix + typ) r, e := NewRR(prefix + typ)
if e != nil { if e != nil {
t.Log("failure to parse: " + prefix + typ) t.Log("failure to parse: " + prefix + typ)

View File

@ -296,6 +296,9 @@ func setNS(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
l := <-c l := <-c
rr.Ns = l.token rr.Ns = l.token
if l.length == 0 {
return rr, nil
}
if l.token == "@" { if l.token == "@" {
rr.Ns = o rr.Ns = o
return rr, nil return rr, nil
@ -339,6 +342,9 @@ func setNSAPPTR(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
l := <-c l := <-c
rr.Ptr = l.token rr.Ptr = l.token
if l.length == 0 {
return rr, nil
}
if l.token == "@" { if l.token == "@" {
rr.Ptr = o rr.Ptr = o
return rr, nil return rr, nil
@ -359,6 +365,9 @@ func setRP(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
l := <-c l := <-c
rr.Mbox = l.token rr.Mbox = l.token
if l.length == 0 {
return rr, nil
}
if l.token == "@" { if l.token == "@" {
rr.Mbox = o rr.Mbox = o
} else { } else {
@ -393,6 +402,9 @@ func setMR(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
l := <-c l := <-c
rr.Mr = l.token rr.Mr = l.token
if l.length == 0 {
return rr, nil
}
if l.token == "@" { if l.token == "@" {
rr.Mr = o rr.Mr = o
return rr, nil return rr, nil
@ -413,6 +425,9 @@ func setMB(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
l := <-c l := <-c
rr.Mb = l.token rr.Mb = l.token
if l.length == 0 {
return rr, nil
}
if l.token == "@" { if l.token == "@" {
rr.Mb = o rr.Mb = o
return rr, nil return rr, nil
@ -433,6 +448,9 @@ func setMG(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
l := <-c l := <-c
rr.Mg = l.token rr.Mg = l.token
if l.length == 0 {
return rr, nil
}
if l.token == "@" { if l.token == "@" {
rr.Mg = o rr.Mg = o
return rr, nil return rr, nil
@ -466,6 +484,9 @@ func setMINFO(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
l := <-c l := <-c
rr.Rmail = l.token rr.Rmail = l.token
if l.length == 0 {
return rr, nil
}
if l.token == "@" { if l.token == "@" {
rr.Rmail = o rr.Rmail = o
} else { } else {
@ -500,6 +521,9 @@ func setMF(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
l := <-c l := <-c
rr.Mf = l.token rr.Mf = l.token
if l.length == 0 {
return rr, nil
}
if l.token == "@" { if l.token == "@" {
rr.Mf = o rr.Mf = o
return rr, nil return rr, nil
@ -520,6 +544,9 @@ func setMD(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
l := <-c l := <-c
rr.Md = l.token rr.Md = l.token
if l.length == 0 {
return rr, nil
}
if l.token == "@" { if l.token == "@" {
rr.Md = o rr.Md = o
return rr, nil return rr, nil
@ -657,6 +684,9 @@ func setCNAME(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
l := <-c l := <-c
rr.Target = l.token rr.Target = l.token
if l.length == 0 {
return rr, nil
}
if l.token == "@" { if l.token == "@" {
rr.Target = o rr.Target = o
return rr, nil return rr, nil
@ -677,6 +707,9 @@ func setDNAME(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
l := <-c l := <-c
rr.Target = l.token rr.Target = l.token
if l.length == 0 {
return rr, nil
}
if l.token == "@" { if l.token == "@" {
rr.Target = o rr.Target = o
return rr, nil return rr, nil
@ -697,6 +730,9 @@ func setSOA(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
l := <-c l := <-c
rr.Ns = l.token rr.Ns = l.token
if l.length == 0 {
return rr, nil
}
<-c // _BLANK <-c // _BLANK
if l.token == "@" { if l.token == "@" {
rr.Ns = o rr.Ns = o
@ -901,6 +937,9 @@ func setTALINK(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
l := <-c l := <-c
rr.PreviousName = l.token rr.PreviousName = l.token
if l.length == 0 {
return rr, nil
}
if l.token == "@" { if l.token == "@" {
rr.PreviousName = o rr.PreviousName = o
} else { } else {
@ -1247,6 +1286,9 @@ func setNSEC(h RR_Header, c chan lex, o, f string) (RR, *ParseError, string) {
l := <-c l := <-c
rr.NextDomain = l.token rr.NextDomain = l.token
if l.length == 0 {
return rr, nil, l.comment
}
if l.token == "@" { if l.token == "@" {
rr.NextDomain = o rr.NextDomain = o
} else { } else {
@ -2004,6 +2046,9 @@ func setLP(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
<-c // _BLANK <-c // _BLANK
l = <-c // _STRING l = <-c // _STRING
rr.Fqdn = l.token rr.Fqdn = l.token
if l.length == 0 {
return rr, nil
}
if l.token == "@" { if l.token == "@" {
rr.Fqdn = o rr.Fqdn = o
return rr, nil return rr, nil
@ -2086,6 +2131,9 @@ func setPX(h RR_Header, c chan lex, o, f string) (RR, *ParseError) {
<-c // _BLANK <-c // _BLANK
l = <-c // _STRING l = <-c // _STRING
rr.Map822 = l.token rr.Map822 = l.token
if l.length == 0 {
return rr, nil
}
if l.token == "@" { if l.token == "@" {
rr.Map822 = o rr.Map822 = o
return rr, nil return rr, nil