From 7af154eae69497a7b63bdc84e669a3019be5d55a Mon Sep 17 00:00:00 2001 From: Shreyas Zare Date: Sun, 3 Dec 2017 23:20:01 +0530 Subject: [PATCH] Zone: corrected response authoritive flag. --- DnsServerCore/Zone.cs | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/DnsServerCore/Zone.cs b/DnsServerCore/Zone.cs index 3a2ee0e0..b85c18a6 100644 --- a/DnsServerCore/Zone.cs +++ b/DnsServerCore/Zone.cs @@ -516,9 +516,21 @@ namespace DnsServerCore if (closestAuthority == null) return new DnsDatagram(new DnsHeader(request.Header.Identifier, true, DnsOpcode.StandardQuery, false, false, request.Header.RecursionDesired, false, false, false, DnsResponseCode.Refused, 1, 0, 0, 0), request.Question, new DnsResourceRecord[] { }, new DnsResourceRecord[] { }, new DnsResourceRecord[] { }); - DnsResourceRecord[] additional = GetGlueRecords(rootZone, closestAuthority); + bool authoritativeAnswer; + DnsResourceRecord[] additional; - return new DnsDatagram(new DnsHeader(request.Header.Identifier, true, DnsOpcode.StandardQuery, true, false, request.Header.RecursionDesired, false, false, false, DnsResponseCode.NoError, 1, 0, (ushort)closestAuthority.Length, (ushort)additional.Length), request.Question, new DnsResourceRecord[] { }, closestAuthority, additional); + if (closestAuthority[0].Type == DnsResourceRecordType.SOA) + { + authoritativeAnswer = true; + additional = new DnsResourceRecord[] { }; + } + else + { + authoritativeAnswer = false; + additional = GetGlueRecords(rootZone, closestAuthority); + } + + return new DnsDatagram(new DnsHeader(request.Header.Identifier, true, DnsOpcode.StandardQuery, authoritativeAnswer, false, request.Header.RecursionDesired, false, false, false, DnsResponseCode.NoError, 1, 0, (ushort)closestAuthority.Length, (ushort)additional.Length), request.Question, new DnsResourceRecord[] { }, closestAuthority, additional); } else { @@ -560,21 +572,24 @@ namespace DnsServerCore if (closestAuthority == null) return new DnsDatagram(new DnsHeader(request.Header.Identifier, true, DnsOpcode.StandardQuery, false, false, request.Header.RecursionDesired, false, false, false, DnsResponseCode.Refused, 1, 0, 0, 0), request.Question, new DnsResourceRecord[] { }, new DnsResourceRecord[] { }, new DnsResourceRecord[] { }); + bool authoritativeAnswer; DnsResponseCode rCode; DnsResourceRecord[] additional; if (closestAuthority[0].Type == DnsResourceRecordType.SOA) { + authoritativeAnswer = true; rCode = DnsResponseCode.NameError; additional = new DnsResourceRecord[] { }; } else { + authoritativeAnswer = false; rCode = DnsResponseCode.NoError; additional = GetGlueRecords(rootZone, closestAuthority); } - return new DnsDatagram(new DnsHeader(request.Header.Identifier, true, DnsOpcode.StandardQuery, true, false, request.Header.RecursionDesired, false, false, false, rCode, 1, 0, (ushort)closestAuthority.Length, (ushort)additional.Length), request.Question, new DnsResourceRecord[] { }, closestAuthority, additional); + return new DnsDatagram(new DnsHeader(request.Header.Identifier, true, DnsOpcode.StandardQuery, authoritativeAnswer, false, request.Header.RecursionDesired, false, false, false, rCode, 1, 0, (ushort)closestAuthority.Length, (ushort)additional.Length), request.Question, new DnsResourceRecord[] { }, closestAuthority, additional); } }