diff --git a/DnsServerCore/Dns/ZoneManagers/CacheZoneManager.cs b/DnsServerCore/Dns/ZoneManagers/CacheZoneManager.cs
index fd75ce0f..1e847e8a 100644
--- a/DnsServerCore/Dns/ZoneManagers/CacheZoneManager.cs
+++ b/DnsServerCore/Dns/ZoneManagers/CacheZoneManager.cs
@@ -1,6 +1,6 @@
/*
Technitium DNS Server
-Copyright (C) 2020 Shreyas Zare (shreyas@technitium.com)
+Copyright (C) 2021 Shreyas Zare (shreyas@technitium.com)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -17,6 +17,7 @@ along with this program. If not, see .
*/
+using DnsServerCore.Dns.ResourceRecords;
using DnsServerCore.Dns.Zones;
using System.Collections.Generic;
using TechnitiumLibrary.Net.Dns;
@@ -49,6 +50,14 @@ namespace DnsServerCore.Dns.ZoneManagers
protected override void CacheRecords(IReadOnlyList resourceRecords)
{
+ //read and set glue records from base class
+ foreach (DnsResourceRecord resourceRecord in resourceRecords)
+ {
+ IReadOnlyList glueRecords = GetGlueRecordsFrom(resourceRecord);
+ if (glueRecords.Count > 0)
+ resourceRecord.SetGlueRecords(glueRecords);
+ }
+
if (resourceRecords.Count == 1)
{
CacheZone zone = _root.GetOrAdd(resourceRecords[0].Name, delegate (string key)
@@ -89,15 +98,15 @@ namespace DnsServerCore.Dns.ZoneManagers
switch (refRecord.Type)
{
case DnsResourceRecordType.NS:
- ResolveAdditionalRecords((refRecord.RDATA as DnsNSRecord).NameServer, serveStale, additionalRecords);
+ ResolveAdditionalRecords(refRecord, (refRecord.RDATA as DnsNSRecord).NameServer, serveStale, additionalRecords);
break;
case DnsResourceRecordType.MX:
- ResolveAdditionalRecords((refRecord.RDATA as DnsMXRecord).Exchange, serveStale, additionalRecords);
+ ResolveAdditionalRecords(refRecord, (refRecord.RDATA as DnsMXRecord).Exchange, serveStale, additionalRecords);
break;
case DnsResourceRecordType.SRV:
- ResolveAdditionalRecords((refRecord.RDATA as DnsSRVRecord).Target, serveStale, additionalRecords);
+ ResolveAdditionalRecords(refRecord, (refRecord.RDATA as DnsSRVRecord).Target, serveStale, additionalRecords);
break;
}
}
@@ -105,8 +114,26 @@ namespace DnsServerCore.Dns.ZoneManagers
return additionalRecords;
}
- private void ResolveAdditionalRecords(string domain, bool serveStale, List additionalRecords)
+ private void ResolveAdditionalRecords(DnsResourceRecord refRecord, string domain, bool serveStale, List additionalRecords)
{
+ IReadOnlyList glueRecords = refRecord.GetGlueRecords();
+ if (glueRecords.Count > 0)
+ {
+ bool added = false;
+
+ foreach (DnsResourceRecord glueRecord in glueRecords)
+ {
+ if (!glueRecord.IsStale)
+ {
+ added = true;
+ additionalRecords.Add(glueRecord);
+ }
+ }
+
+ if (added)
+ return;
+ }
+
CacheZone cacheZone = _root.FindZone(domain, out _, out _, out _);
if (cacheZone != null)
{