shithub: riscv

Download patch

ref: 00622d4d2b47d949de0894febdc149ed203130ea
parent: 0d7bbda9b93e4af3c512f835cc502a7e9a60c359
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Mon Jul 16 19:54:23 EDT 2018

ndb/dns: fix delegation with norecursion (-R flag)

when the question zone is in a delegated area, we still
need to provide the nameservers.

--- a/sys/src/cmd/ndb/dnserver.c
+++ b/sys/src/cmd/ndb/dnserver.c
@@ -67,34 +67,34 @@
 				Oquery;
 			return;
 		}
-	} else
-		if(norecursion) {
-			/* we don't recurse and we're not authoritative */
-			repp->flags = Rok | Fresp | Oquery;
-			return;
-		}
+	}
+	if(myarea == nil && norecursion) {
+		/* we don't recurse and we're not authoritative */
+		repp->flags = Rok | Fresp | Oquery;
+		neg = nil;
+	} else {
+		/*
+		 *  get the answer if we can, in *repp
+		 */
+		if(reqp->flags & Frecurse)
+			neg = doextquery(repp, req, Recurse);
+		else
+			neg = doextquery(repp, req, Dontrecurse);
 
-	/*
-	 *  get the answer if we can, in *repp
-	 */
-	if(reqp->flags & Frecurse)
-		neg = doextquery(repp, req, Recurse);
-	else
-		neg = doextquery(repp, req, Dontrecurse);
+		/* authority is transitive */
+		if(myarea != nil || (repp->an && repp->an->auth))
+			repp->flags |= Fauth;
 
-	/* authority is transitive */
-	if(myarea != nil || (repp->an && repp->an->auth))
-		repp->flags |= Fauth;
-
-	/* pass on error codes */
-	if(repp->an == nil){
-		dp = dnlookup(repp->qd->owner->name, repp->qd->owner->class, 0);
-		if(dp->rr == nil)
-			if(reqp->flags & Frecurse)
-				repp->flags |= dp->respcode | Fauth;
+		/* pass on error codes */
+		if(repp->an == nil){
+			dp = dnlookup(repp->qd->owner->name, repp->qd->owner->class, 0);
+			if(dp->rr == nil)
+				if(reqp->flags & Frecurse)
+					repp->flags |= dp->respcode | Fauth;
+		}
 	}
 
-	if(myarea == nil)
+	if(myarea == nil){
 		/*
 		 *  add name server if we know
 		 */
@@ -120,6 +120,7 @@
 			if(repp->ns)
 				break;
 		}
+	}
 
 	/*
 	 *  add ip addresses as hints
@@ -135,7 +136,7 @@
 	 *  add an soa to the authority section to help client
 	 *  with negative caching
 	 */
-	if(repp->an == nil)
+	if(repp->an == nil){
 		if(myarea != nil){
 			rrcopy(myarea->soarr, &tp);
 			rrcat(&repp->ns, tp);
@@ -146,6 +147,7 @@
 			}
 			repp->flags |= neg->negrcode;
 		}
+	}
 
 	/*
 	 *  get rid of duplicates