From c7f594e2dcda23fdc2ae2c4246da3e7c519f897e Mon Sep 17 00:00:00 2001 From: Otto Moerbeek Date: Tue, 13 Feb 2024 16:55:10 +0100 Subject: [PATCH] rec: fix the zoneToCache regression introduced by SA 2024-01 Test will follow --- pdns/recursordist/rec-zonetocache.cc | 6 +++--- pdns/zonemd.cc | 2 +- pdns/zonemd.hh | 9 ++++++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/pdns/recursordist/rec-zonetocache.cc b/pdns/recursordist/rec-zonetocache.cc index 8d4ab260bf47..415933ca4bc7 100644 --- a/pdns/recursordist/rec-zonetocache.cc +++ b/pdns/recursordist/rec-zonetocache.cc @@ -275,7 +275,7 @@ vState ZoneData::dnssecValidate(pdns::ZoneMD& zonemd, size_t& zonemdCount) const } skeyset_t validKeys; - vState dnsKeyState = validateDNSKeysAgainstDS(d_now, d_zone, dsmap, dnsKeys, records, zonemd.getRRSIGs(), validKeys, std::nullopt, validationContext); + vState dnsKeyState = validateDNSKeysAgainstDS(d_now, d_zone, dsmap, dnsKeys, records, zonemd.getRRSIGs(QType::DNSKEY), validKeys, std::nullopt, validationContext); if (dnsKeyState != vState::Secure) { return dnsKeyState; } @@ -306,7 +306,7 @@ vState ZoneData::dnssecValidate(pdns::ZoneMD& zonemd, size_t& zonemdCount) const for (const auto& rec : zonemd.getNSEC3Params()) { records.emplace(rec); } - nsecValidationStatus = validateWithKeySet(d_now, d_zone, records, zonemd.getRRSIGs(), validKeys, std::nullopt, validationContext); + nsecValidationStatus = validateWithKeySet(d_now, d_zone, records, zonemd.getRRSIGs(QType::NSEC3PARAM), validKeys, std::nullopt, validationContext); if (nsecValidationStatus != vState::Secure) { d_log->info(Logr::Warning, "NSEC3PARAMS records did not validate"); return nsecValidationStatus; @@ -339,7 +339,7 @@ vState ZoneData::dnssecValidate(pdns::ZoneMD& zonemd, size_t& zonemdCount) const for (const auto& rec : zonemdRecords) { records.emplace(rec); } - return validateWithKeySet(d_now, d_zone, records, zonemd.getRRSIGs(), validKeys, std::nullopt, validationContext); + return validateWithKeySet(d_now, d_zone, records, zonemd.getRRSIGs(QType::ZONEMD), validKeys, std::nullopt, validationContext); } void ZoneData::ZoneToCache(const RecZoneToCache::Config& config) diff --git a/pdns/zonemd.cc b/pdns/zonemd.cc index c3274f4f22fc..e427f41e8054 100644 --- a/pdns/zonemd.cc +++ b/pdns/zonemd.cc @@ -77,7 +77,7 @@ void pdns::ZoneMD::processRecord(const DNSRecord& record) if (rrsig == nullptr) { throw PDNSException("Invalid RRSIG record"); } - d_rrsigs.emplace_back(rrsig); + d_rrsigs[rrsig->d_type].emplace_back(rrsig); if (rrsig->d_type == QType::NSEC) { d_nsecs.signatures.emplace_back(rrsig); } diff --git a/pdns/zonemd.hh b/pdns/zonemd.hh index e941a951f5bb..bb5a75f1582d 100644 --- a/pdns/zonemd.hh +++ b/pdns/zonemd.hh @@ -66,9 +66,12 @@ public: } // Return the zone's apex RRSIGs - [[nodiscard]] const std::vector>& getRRSIGs() const + [[nodiscard]] const std::vector>& getRRSIGs(QType requestedType) { - return d_rrsigs; + if (d_rrsigs.count(requestedType) == 0) { + d_rrsigs[requestedType] = {}; + } + return d_rrsigs[requestedType]; } // Return the zone's apex ZONEMDs @@ -140,7 +143,7 @@ private: std::shared_ptr d_soaRecordContent; std::set> d_dnskeys; - std::vector> d_rrsigs; + std::map>> d_rrsigs; std::vector> d_nsec3params; ContentSigPair d_nsecs; map d_nsec3s;