AuthZoneManager: updated ResolveCNAME() to detect CNAME loops.

This commit is contained in:
Shreyas Zare
2022-10-30 17:49:38 +05:30
parent d47ea907ff
commit 2bdef61f35

View File

@@ -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;
}