Commit Diff


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)
 			}