mirror of
https://github.com/fergalmoran/DnsServer.git
synced 2026-03-06 21:45:15 +00:00
AuthZoneManager: updated ResolveCNAME() to detect CNAME loops.
This commit is contained in:
@@ -258,19 +258,34 @@ namespace DnsServerCore.Dns.ZoneManagers
|
||||
|
||||
do
|
||||
{
|
||||
if (!_root.TryGet((lastCNAME.RDATA as DnsCNAMERecordData).Domain, out AuthZoneNode zoneNode))
|
||||
string cnameDomain = (lastCNAME.RDATA as DnsCNAMERecordData).Domain;
|
||||
if (lastCNAME.Name.Equals(cnameDomain, StringComparison.OrdinalIgnoreCase))
|
||||
break; //loop detected
|
||||
|
||||
if (!_root.TryGet(cnameDomain, out AuthZoneNode zoneNode))
|
||||
break;
|
||||
|
||||
IReadOnlyList<DnsResourceRecord> records = zoneNode.QueryRecords(question.Type, dnssecOk);
|
||||
if (records.Count < 1)
|
||||
break;
|
||||
|
||||
answerRecords.AddRange(records);
|
||||
|
||||
DnsResourceRecord lastRR = records[records.Count - 1];
|
||||
|
||||
if (lastRR.Type != DnsResourceRecordType.CNAME)
|
||||
{
|
||||
answerRecords.AddRange(records);
|
||||
break;
|
||||
}
|
||||
|
||||
foreach (DnsResourceRecord answerRecord in answerRecords)
|
||||
{
|
||||
if (answerRecord.Type != DnsResourceRecordType.CNAME)
|
||||
continue;
|
||||
|
||||
if (answerRecord.RDATA.Equals(lastRR.RDATA))
|
||||
return; //loop detected
|
||||
}
|
||||
|
||||
answerRecords.AddRange(records);
|
||||
|
||||
lastCNAME = lastRR;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user