Skip to content

Commit 37f2851

Browse files
committed
Fix handling of NOERROR empty answer
1 parent 97b96eb commit 37f2851

File tree

2 files changed

+23
-24
lines changed

2 files changed

+23
-24
lines changed

client/server.go

+7-5
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,16 @@ func (s Servers) String() string {
5454
// DelegationCache store and retrive delegations.
5555
type DelegationCache map[string]Servers
5656

57-
// Get returns the most specific name server for domain.
58-
func (d DelegationCache) Get(domain string) Servers {
57+
// Get returns the most specific name servers for domain with its matching label.
58+
func (d DelegationCache) Get(domain string) (label string, servers Servers) {
5959
for offset, end := 0, false; !end; offset, end = dns.NextLabel(domain, offset) {
60-
if servers, found := d[domain[offset:]]; found {
61-
return servers
60+
label = domain[offset:]
61+
var found bool
62+
if servers, found = d[label]; found {
63+
return
6264
}
6365
}
64-
return roots
66+
return ".", roots
6567
}
6668

6769
// Add adds a server as a delegation for domain. If addrs is not specified,

main.go

+16-19
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ func main() {
8080
m.Extra = append(m.Extra, o)
8181

8282
for i := 1; i < 100; i++ {
83-
servers := delegs.Get(name)
83+
deleg, servers := delegs.Get(name)
8484
m.SetQuestion(name, rtype)
8585
rs := c.ParallelQuery(m, servers)
8686
fr := rs.Fastest()
@@ -143,28 +143,25 @@ func main() {
143143
fmt.Printf("%s %d NS %s (%s)\n", ns.Header().Name, ns.Header().Ttl, ns.Ns, glue)
144144
}
145145

146-
var cname string
147-
var done bool
148-
for _, rr := range r.Answer {
149-
if rr.Header().Rrtype == rtype && rr.Header().Name == name {
150-
if !done {
151-
fmt.Println()
146+
if len(r.Answer) > 0 {
147+
var cname string
148+
fmt.Println()
149+
for _, rr := range r.Answer {
150+
if rr.Header().Rrtype == dns.TypeCNAME {
151+
cname = rr.Header().Name
152+
name = rr.(*dns.CNAME).Target
153+
} else {
154+
fmt.Println(rr)
152155
}
153-
fmt.Println(rr)
154-
done = true
155-
} else if rr.Header().Rrtype == dns.TypeCNAME {
156-
cname = rr.Header().Name
157-
name = rr.(*dns.CNAME).Target
158156
}
159-
}
160-
if done {
161-
return
162-
} else if cname != "" {
163-
fmt.Printf(col("\n~ following CNAME %s -> %s\n", cBlue), cname, name)
164-
continue
157+
if cname != "" {
158+
fmt.Printf(col("~ following CNAME %s -> %s\n", cBlue), cname, name)
159+
continue
160+
}
161+
break
165162
}
166163

167-
if len(r.Ns) == 0 {
164+
if label, _ := delegs.Get(name); len(r.Ns) == 0 || deleg == label {
168165
break
169166
}
170167
}

0 commit comments

Comments
 (0)