From 3ec2152f523a54869c7ba8bf896b6ec2643be6eb Mon Sep 17 00:00:00 2001 From: Shreyas Zare Date: Sun, 5 May 2019 18:16:25 +0530 Subject: [PATCH] DnsServer: ProcessRecursiveQuery() fixed additional record in response to work only for MX requests. --- DnsServerCore/DnsServer.cs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/DnsServerCore/DnsServer.cs b/DnsServerCore/DnsServer.cs index 77e092ff..450b14c2 100644 --- a/DnsServerCore/DnsServer.cs +++ b/DnsServerCore/DnsServer.cs @@ -1072,6 +1072,7 @@ namespace DnsServerCore DnsDatagram response = RecursiveResolve(request, viaNameServers, false, cacheRefreshOperation); DnsResourceRecord[] authority; + DnsResourceRecord[] additional; if ((response.Header.RCODE == DnsResponseCode.NoError) && (response.Answer.Length > 0)) { @@ -1117,7 +1118,12 @@ namespace DnsServerCore else authority = new DnsResourceRecord[] { }; - return new DnsDatagram(new DnsHeader(request.Header.Identifier, true, DnsOpcode.StandardQuery, false, false, true, true, false, false, lastResponse.Header.RCODE, 1, (ushort)responseAnswer.Count, (ushort)authority.Length, lastResponse.Header.ARCOUNT), request.Question, responseAnswer.ToArray(), authority, lastResponse.Additional) { Tag = (cacheHit ? "cacheHit" : null) }; + if ((response.Additional.Length > 0) && (request.Question[0].Type == DnsResourceRecordType.MX)) + additional = response.Additional; + else + additional = new DnsResourceRecord[] { }; + + return new DnsDatagram(new DnsHeader(request.Header.Identifier, true, DnsOpcode.StandardQuery, false, false, true, true, false, false, lastResponse.Header.RCODE, 1, (ushort)responseAnswer.Count, (ushort)authority.Length, (ushort)additional.Length), request.Question, responseAnswer.ToArray(), authority, additional) { Tag = (cacheHit ? "cacheHit" : null) }; } } @@ -1126,7 +1132,12 @@ namespace DnsServerCore else authority = new DnsResourceRecord[] { }; - return new DnsDatagram(new DnsHeader(request.Header.Identifier, true, DnsOpcode.StandardQuery, false, false, true, true, false, false, response.Header.RCODE, 1, (ushort)response.Answer.Length, (ushort)authority.Length, response.Header.ARCOUNT), request.Question, response.Answer, authority, response.Additional) { Tag = response.Tag }; + if ((response.Additional.Length > 0) && (request.Question[0].Type == DnsResourceRecordType.MX)) + additional = response.Additional; + else + additional = new DnsResourceRecord[] { }; + + return new DnsDatagram(new DnsHeader(request.Header.Identifier, true, DnsOpcode.StandardQuery, false, false, true, true, false, false, response.Header.RCODE, 1, (ushort)response.Answer.Length, (ushort)authority.Length, (ushort)additional.Length), request.Question, response.Answer, authority, additional) { Tag = response.Tag }; } private DnsDatagram RecursiveResolve(DnsDatagram request, NameServerAddress[] viaNameServers, bool cachePrefetchOperation, bool cacheRefreshOperation)