Fix handling of dnames

Add support for escaped dots. Only thing to fix is the
fqdn-ness of user defined names.
This commit is contained in:
Miek Gieben 2012-01-08 14:53:55 +01:00
parent 0322d3a9da
commit b417c42bc2
2 changed files with 32 additions and 1 deletions

View File

@ -198,7 +198,7 @@ func (dns *Msg) IsEdns0() (ok bool) {
// IsDomainName checks if s is a valid domainname, it returns
// true and a length, when a domain name is valid. When false
// is return the length isn't specified.
// ithe returned length isn't specified.
func IsDomainName(s string) (bool, int) { // copied from net package.
// See RFC 1035, RFC 3696.
if len(s) == 0 {
@ -224,6 +224,8 @@ func IsDomainName(s string) (bool, int) { // copied from net package.
ok = true
partlen++
n++
case c == '\\':
// Ok
case '0' <= c && c <= '9':
// fine
partlen++
@ -239,6 +241,11 @@ func IsDomainName(s string) (bool, int) { // copied from net package.
if last == '.' || last == '-' {
return false, 0
}
if last == '\\' { // Ok, escaped dot.
partlen++
n++
break
}
if partlen > 63 || partlen == 0 {
return false, 0
}

View File

@ -130,6 +130,30 @@ z3.miek.nl. IN NSEC miek.nl. TXT RRSIG NSEC`
}
}
func TestDomainName(t *testing.T) {
tests := []string{"r\\.gieben.miek.nl."}
dbuff := make([]byte, 40)
for _, ts := range tests {
if _, ok := PackDomainName(ts, dbuff, 0); !ok {
t.Log("Not a valid domain name")
t.Fail()
continue
}
n, _, ok := UnpackDomainName(dbuff, 0)
if !ok {
t.Log("Failed to unpack packed domain name")
t.Fail()
continue;
}
if ts != n {
t.Logf("Must be equal: in: %s, out: %s\n", ts, n)
t.Fail()
}
}
}
func TestParseBrace(t *testing.T) {
tests := map[string]string{
"(miek.nl.) 3600 IN A 127.0.0.1": "miek.nl.\t3600\tIN\tA\t127.0.0.1",