commit dc137f704dec33e5b5ab4cdb9548bb3b0d5bee3d from: Oliver Lowe date: Sat Dec 18 03:26:21 2021 UTC cmd/recursor: bail out on query loop Pretty easy fix: just keep track of where we're up to each time we call resolve(). Fixes: https://todo.sr.ht/~otl/dns/4 commit - d5834ac9c24e2b94ddd01468976b08de9bb90ce8 commit + dc137f704dec33e5b5ab4cdb9548bb3b0d5bee3d blob - 7aa4fa1052d05864c09d1a8ee9c858ab1f03d72f blob + 137de3669fd4432923f8c2ef2e2f7cae846ef700 --- cmd/recursor/resolve.go +++ cmd/recursor/resolve.go @@ -51,10 +51,10 @@ func nextServerAddrs(resources []dnsmessage.Resource) } func resolveFromRoot(q dnsmessage.Question) (dnsmessage.Message, error) { - return resolve(q, roots) + return resolve(q, roots, 0) } -func resolve(q dnsmessage.Question, next []net.IP) (dnsmessage.Message, error) { +func resolve(q dnsmessage.Question, next []net.IP, depth int) (dnsmessage.Message, error) { var rmsg dnsmessage.Message var err error if rrs, ok := lookup(q.Name, q.Type); ok { @@ -63,6 +63,10 @@ func resolve(q dnsmessage.Question, next []net.IP) (dn } fmt.Fprintln(os.Stderr, "cache miss", q.Name, q.Type) + if depth > 12 { + return dnsmessage.Message{}, fmt.Errorf("query loop") + } + for _, ip := range next { // Aussie Broadband doesn't support IPv6 yet! if isIPv6(ip) { @@ -110,9 +114,9 @@ func resolve(q dnsmessage.Question, next []net.IP) (dn continue } if len(rmsg.Answers) > 0 { - return resolve(q, nextServerAddrs(rmsg.Answers)) + return resolve(q, nextServerAddrs(rmsg.Answers), depth+1) } - return resolve(q, nextServerAddrs(rmsg.Additionals)) + return resolve(q, nextServerAddrs(rmsg.Additionals), depth+1) default: return rmsg, fmt.Errorf("unexpected authority resource type %s", a.Header.Type) }