From f1545ea8528873553520b027dcc78181edb2fe6b Mon Sep 17 00:00:00 2001 From: Shreyas Zare Date: Sun, 2 Jun 2019 14:55:15 +0530 Subject: [PATCH] Zone: updated QueryCache() implementation to return only name servers with glue records available in cache. --- DnsServerCore/Zone.cs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/DnsServerCore/Zone.cs b/DnsServerCore/Zone.cs index 401e7d47..e4db0c6f 100644 --- a/DnsServerCore/Zone.cs +++ b/DnsServerCore/Zone.cs @@ -806,12 +806,17 @@ namespace DnsServerCore } } - DnsResourceRecord[] nameServers = closestZone.QueryClosestCachedNameServers(serveStale); - if (nameServers != null) + while (closestZone != null) { - DnsResourceRecord[] additional = QueryGlueRecords(rootZone, nameServers, serveStale); + DnsResourceRecord[] nameServers = closestZone.QueryClosestCachedNameServers(serveStale); + if (nameServers == null) + break; - return new DnsDatagram(new DnsHeader(request.Header.Identifier, true, DnsOpcode.StandardQuery, false, false, request.Header.RecursionDesired, true, false, false, DnsResponseCode.NoError, 1, 0, (ushort)nameServers.Length, (ushort)additional.Length), request.Question, new DnsResourceRecord[] { }, nameServers, additional); + DnsResourceRecord[] additional = QueryGlueRecords(rootZone, nameServers, serveStale); + if (additional.Length > 0) + return new DnsDatagram(new DnsHeader(request.Header.Identifier, true, DnsOpcode.StandardQuery, false, false, request.Header.RecursionDesired, true, false, false, DnsResponseCode.NoError, 1, 0, (ushort)nameServers.Length, (ushort)additional.Length), request.Question, new DnsResourceRecord[] { }, nameServers, additional); + + closestZone = closestZone._parentZone; } return new DnsDatagram(new DnsHeader(request.Header.Identifier, true, DnsOpcode.StandardQuery, false, false, request.Header.RecursionDesired, true, false, false, DnsResponseCode.Refused, 1, 0, 0, 0), request.Question, new DnsResourceRecord[] { }, new DnsResourceRecord[] { }, new DnsResourceRecord[] { });