From b4a85ae2ddbd31a1e2f2ffedea6a76de5b232a3d Mon Sep 17 00:00:00 2001 From: Shreyas Zare Date: Wed, 1 May 2019 19:38:41 +0530 Subject: [PATCH] Zone: fixed string comparison issue caused with certain system locale. added missing RDATA type check while querying for glue records. --- DnsServerCore/Zone.cs | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/DnsServerCore/Zone.cs b/DnsServerCore/Zone.cs index 5d163b58..b7d32218 100644 --- a/DnsServerCore/Zone.cs +++ b/DnsServerCore/Zone.cs @@ -171,7 +171,7 @@ namespace DnsServerCore if (currentZone == null) return false; - if (!currentZone._authoritativeZone && (currentZone._zoneName.Equals("root-servers.net", StringComparison.CurrentCultureIgnoreCase))) + if (!currentZone._authoritativeZone && (currentZone._zoneName.Equals("root-servers.net", StringComparison.OrdinalIgnoreCase))) return false; //cannot delete root-servers.net currentZone._entries.Clear(); @@ -192,7 +192,7 @@ namespace DnsServerCore else { //cache zone - if (currentZone._zoneName.Equals("root-servers.net", StringComparison.CurrentCultureIgnoreCase)) + if (currentZone._zoneName.Equals("root-servers.net", StringComparison.OrdinalIgnoreCase)) return false; //cannot delete root-servers.net } @@ -550,7 +550,7 @@ namespace DnsServerCore private DnsResourceRecord[] QueryClosestCachedNameServers(bool serveStale) { Zone currentZone = this; - DnsResourceRecord[] nsRecords = null; + DnsResourceRecord[] nsRecords; while (currentZone != null) { @@ -572,7 +572,7 @@ namespace DnsServerCore while (currentZone != null) { nsRecords = currentZone.QueryRecords(DnsResourceRecordType.SOA, true, false); - if ((nsRecords != null) && (nsRecords.Length > 0) && (nsRecords[0].RDATA as DnsSOARecord).MasterNameServer.Equals(rootZoneServerDomain, StringComparison.CurrentCultureIgnoreCase)) + if ((nsRecords != null) && (nsRecords.Length > 0) && (nsRecords[0].RDATA as DnsSOARecord).MasterNameServer.Equals(rootZoneServerDomain, StringComparison.OrdinalIgnoreCase)) return nsRecords; nsRecords = currentZone.QueryRecords(DnsResourceRecordType.NS, true, false); @@ -634,13 +634,13 @@ namespace DnsServerCore { { DnsResourceRecord[] records = zone.QueryRecords(DnsResourceRecordType.A, true, serveStale); - if ((records != null) && (records.Length > 0)) + if ((records != null) && (records.Length > 0) && (records[0].RDATA is DnsARecord)) glueRecords.AddRange(records); } { DnsResourceRecord[] records = zone.QueryRecords(DnsResourceRecordType.AAAA, true, serveStale); - if ((records != null) && (records.Length > 0)) + if ((records != null) && (records.Length > 0) && (records[0].RDATA is DnsAAAARecord)) glueRecords.AddRange(records); } } @@ -868,15 +868,16 @@ namespace DnsServerCore foreach (DnsResourceRecord record in records) { Dictionary> groupedByTypeRecords; + string recordName = record.Name.ToLower(); - if (groupedByDomainRecords.ContainsKey(record.Name)) + if (groupedByDomainRecords.ContainsKey(recordName)) { - groupedByTypeRecords = groupedByDomainRecords[record.Name]; + groupedByTypeRecords = groupedByDomainRecords[recordName]; } else { groupedByTypeRecords = new Dictionary>(); - groupedByDomainRecords.Add(record.Name, groupedByTypeRecords); + groupedByDomainRecords.Add(recordName, groupedByTypeRecords); } List groupedRecords; @@ -951,7 +952,7 @@ namespace DnsServerCore foreach (DnsResourceRecord answer in response.Answer) { - if (answer.Name.Equals(qName, StringComparison.CurrentCultureIgnoreCase)) + if (answer.Name.Equals(qName, StringComparison.OrdinalIgnoreCase)) { allRecords.Add(answer); @@ -964,11 +965,11 @@ namespace DnsServerCore case DnsResourceRecordType.NS: string nsDomain = (answer.RDATA as DnsNSRecord).NSDomainName; - if (!nsDomain.EndsWith(".root-servers.net", StringComparison.CurrentCultureIgnoreCase)) + if (!nsDomain.EndsWith(".root-servers.net", StringComparison.OrdinalIgnoreCase)) { foreach (DnsResourceRecord record in response.Additional) { - if (nsDomain.Equals(record.Name, StringComparison.CurrentCultureIgnoreCase)) + if (nsDomain.Equals(record.Name, StringComparison.OrdinalIgnoreCase)) allRecords.Add(record); } } @@ -980,7 +981,7 @@ namespace DnsServerCore foreach (DnsResourceRecord record in response.Additional) { - if (mxExchange.Equals(record.Name, StringComparison.CurrentCultureIgnoreCase)) + if (mxExchange.Equals(record.Name, StringComparison.OrdinalIgnoreCase)) allRecords.Add(record); } @@ -1017,7 +1018,7 @@ namespace DnsServerCore { foreach (DnsResourceRecord authorityRecord in response.Authority) { - if ((authorityRecord.Type == DnsResourceRecordType.NS) && question.Name.Equals(authorityRecord.Name, StringComparison.CurrentCultureIgnoreCase) && (authorityRecord.RDATA as DnsNSRecord).NSDomainName.Equals(response.Metadata.NameServerAddress.Host, StringComparison.CurrentCultureIgnoreCase)) + if ((authorityRecord.Type == DnsResourceRecordType.NS) && question.Name.Equals(authorityRecord.Name, StringComparison.OrdinalIgnoreCase) && (authorityRecord.RDATA as DnsNSRecord).NSDomainName.Equals(response.Metadata.NameServerAddress.Host, StringComparison.OrdinalIgnoreCase)) { //empty response from authority name server DnsResourceRecord record = new DnsResourceRecord(question.Name, question.Type, DnsClass.IN, DEFAULT_RECORD_TTL, new DnsEmptyRecord(null)); @@ -1054,7 +1055,7 @@ namespace DnsServerCore { foreach (DnsResourceRecord authority in response.Authority) { - if (question.Name.Equals(authority.Name, StringComparison.CurrentCultureIgnoreCase) || question.Name.EndsWith("." + authority.Name, StringComparison.CurrentCultureIgnoreCase)) + if (question.Name.Equals(authority.Name, StringComparison.OrdinalIgnoreCase) || question.Name.EndsWith("." + authority.Name, StringComparison.OrdinalIgnoreCase)) { allRecords.Add(authority); @@ -1062,11 +1063,11 @@ namespace DnsServerCore { string nsDomain = (authority.RDATA as DnsNSRecord).NSDomainName; - if (!nsDomain.EndsWith(".root-servers.net", StringComparison.CurrentCultureIgnoreCase)) + if (!nsDomain.EndsWith(".root-servers.net", StringComparison.OrdinalIgnoreCase)) { foreach (DnsResourceRecord record in response.Additional) { - if (nsDomain.Equals(record.Name, StringComparison.CurrentCultureIgnoreCase)) + if (nsDomain.Equals(record.Name, StringComparison.OrdinalIgnoreCase)) allRecords.Add(record); } } @@ -1172,7 +1173,7 @@ namespace DnsServerCore { case DnsResourceRecordType.CNAME: case DnsResourceRecordType.PTR: - if (oldRecord.Name.Equals(newRecord.Name, StringComparison.CurrentCultureIgnoreCase)) + if (oldRecord.Name.Equals(newRecord.Name, StringComparison.OrdinalIgnoreCase)) { currentZone.SetRecords(newRecord.Type, new DnsResourceRecord[] { newRecord }); }