From 9fa91d96f7cfd6b9571d0e071fd1325691c04c2b Mon Sep 17 00:00:00 2001 From: Shreyas Zare Date: Sat, 20 Jun 2020 19:12:50 +0530 Subject: [PATCH] AuthZoneManager: updated SyncRecords() to handle root zone case. Prevented SyncRecords() from overwriting glue addresses for SOA record. --- .../Dns/ZoneManagers/AuthZoneManager.cs | 40 +++++++++++++++---- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/DnsServerCore/Dns/ZoneManagers/AuthZoneManager.cs b/DnsServerCore/Dns/ZoneManagers/AuthZoneManager.cs index d05cf6bd..b7acc28e 100644 --- a/DnsServerCore/Dns/ZoneManagers/AuthZoneManager.cs +++ b/DnsServerCore/Dns/ZoneManagers/AuthZoneManager.cs @@ -492,7 +492,7 @@ namespace DnsServerCore.Dns.ZoneManagers List zones = _root.GetZoneWithSubDomainZones(domain); - if ((zones.Count > 0) && (zones[0] is PrimaryZone) && zones[0].IsActive) + if ((zones.Count > 0) && zones[0].IsActive) { //only primary zones support zone transfer DnsResourceRecord soaRecord = zones[0].QueryRecords(DnsResourceRecordType.SOA)[0]; @@ -558,14 +558,39 @@ namespace DnsServerCore.Dns.ZoneManagers if (syncRecords[0].Type == DnsResourceRecordType.SOA) i = 1; //skip first SOA in AXFR - for (; i < syncRecords.Count; i++) + if (domain.Length == 0) { - DnsResourceRecord record = syncRecords[i]; + //root zone case + for (; i < syncRecords.Count; i++) + { + DnsResourceRecord record = syncRecords[i]; - if (record.Name.EndsWith(domain, StringComparison.OrdinalIgnoreCase)) - newRecords.Add(record); - else if (!glueRecords.Contains(record)) - glueRecords.Add(record); + switch (record.Type) + { + case DnsResourceRecordType.A: + case DnsResourceRecordType.AAAA: + if (!glueRecords.Contains(record)) + glueRecords.Add(record); + + break; + + default: + newRecords.Add(record); + break; + } + } + } + else + { + for (; i < syncRecords.Count; i++) + { + DnsResourceRecord record = syncRecords[i]; + + if (record.Name.EndsWith(domain, StringComparison.OrdinalIgnoreCase)) + newRecords.Add(record); + else if (!glueRecords.Contains(record)) + glueRecords.Add(record); + } } if (glueRecords.Count > 0) @@ -575,7 +600,6 @@ namespace DnsServerCore.Dns.ZoneManagers switch (record.Type) { case DnsResourceRecordType.NS: - case DnsResourceRecordType.SOA: record.SetGlueRecords(glueRecords); break; }