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:
parent
0322d3a9da
commit
b417c42bc2
|
@ -198,7 +198,7 @@ func (dns *Msg) IsEdns0() (ok bool) {
|
||||||
|
|
||||||
// IsDomainName checks if s is a valid domainname, it returns
|
// IsDomainName checks if s is a valid domainname, it returns
|
||||||
// true and a length, when a domain name is valid. When false
|
// 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.
|
func IsDomainName(s string) (bool, int) { // copied from net package.
|
||||||
// See RFC 1035, RFC 3696.
|
// See RFC 1035, RFC 3696.
|
||||||
if len(s) == 0 {
|
if len(s) == 0 {
|
||||||
|
@ -224,6 +224,8 @@ func IsDomainName(s string) (bool, int) { // copied from net package.
|
||||||
ok = true
|
ok = true
|
||||||
partlen++
|
partlen++
|
||||||
n++
|
n++
|
||||||
|
case c == '\\':
|
||||||
|
// Ok
|
||||||
case '0' <= c && c <= '9':
|
case '0' <= c && c <= '9':
|
||||||
// fine
|
// fine
|
||||||
partlen++
|
partlen++
|
||||||
|
@ -239,6 +241,11 @@ func IsDomainName(s string) (bool, int) { // copied from net package.
|
||||||
if last == '.' || last == '-' {
|
if last == '.' || last == '-' {
|
||||||
return false, 0
|
return false, 0
|
||||||
}
|
}
|
||||||
|
if last == '\\' { // Ok, escaped dot.
|
||||||
|
partlen++
|
||||||
|
n++
|
||||||
|
break
|
||||||
|
}
|
||||||
if partlen > 63 || partlen == 0 {
|
if partlen > 63 || partlen == 0 {
|
||||||
return false, 0
|
return false, 0
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
func TestParseBrace(t *testing.T) {
|
||||||
tests := map[string]string{
|
tests := map[string]string{
|
||||||
"(miek.nl.) 3600 IN A 127.0.0.1": "miek.nl.\t3600\tIN\tA\t127.0.0.1",
|
"(miek.nl.) 3600 IN A 127.0.0.1": "miek.nl.\t3600\tIN\tA\t127.0.0.1",
|
||||||
|
|
Loading…
Reference in New Issue