Skip to content

Commit 805a828

Browse files
committed
Make NS delegation check parallel — fix hang on filtered networks
1 parent 5835665 commit 805a828

1 file changed

Lines changed: 18 additions & 5 deletions

File tree

internal/scanner/dns.go

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -140,14 +140,27 @@ var nsResolvers = []string{
140140
"213.42.20.20", // Etisalat DNS (UAE)
141141
}
142142

143-
// QueryNSMulti tries multiple public resolvers to verify NS delegation.
144-
// Returns on the first successful response.
143+
// QueryNSMulti tries all resolvers in parallel and returns the first successful result.
144+
// Overall deadline is the per-resolver timeout (first responder wins).
145145
func QueryNSMulti(domain string, timeout time.Duration) ([]string, bool) {
146+
type nsResult struct {
147+
hosts []string
148+
ok bool
149+
}
150+
ch := make(chan nsResult, len(nsResolvers))
146151
for _, resolver := range nsResolvers {
147-
hosts, ok := QueryNS(resolver, domain, timeout)
148-
if ok && len(hosts) > 0 {
149-
return hosts, true
152+
go func(r string) {
153+
hosts, ok := QueryNS(r, domain, timeout)
154+
ch <- nsResult{hosts, ok && len(hosts) > 0}
155+
}(resolver)
156+
}
157+
failures := 0
158+
for range nsResolvers {
159+
res := <-ch
160+
if res.ok {
161+
return res.hosts, true
150162
}
163+
failures++
151164
}
152165
return nil, false
153166
}

0 commit comments

Comments
 (0)