From: Miod Vallat Date: Mon, 30 Jun 2025 06:54:29 +0000 (+0200) Subject: Factor code checking for a NSEC3 back chain record. X-Git-Tag: rec-5.3.0-alpha2~29^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=06c51ead654f0586a7fef96641e56aad8b98ccc6;p=thirdparty%2Fpdns.git Factor code checking for a NSEC3 back chain record. Signed-off-by: Miod Vallat --- diff --git a/modules/lmdbbackend/lmdbbackend.cc b/modules/lmdbbackend/lmdbbackend.cc index dd49464d15..2415554bc6 100644 --- a/modules/lmdbbackend/lmdbbackend.cc +++ b/modules/lmdbbackend/lmdbbackend.cc @@ -2323,6 +2323,17 @@ bool LMDBBackend::unpublishDomainKey(const ZoneName& name, unsigned int keyId) return true; } +bool LMDBBackend::isNSEC3BackRecord(LMDBResourceRecord& lrr, const MDBOutVal& key, const MDBOutVal& val) +{ + if (compoundOrdername::getQType(key.getNoStripHeader()) == QType::NSEC3) { + deserializeFromBuffer(val.get(), lrr); + if (lrr.ttl == 0) { + return true; + } + } + return false; +} + // NOLINTNEXTLINE(readability-function-cognitive-complexity,readability-identifier-length) bool LMDBBackend::getBeforeAndAfterNamesAbsolute(domainid_t id, const DNSName& qname, DNSName& unhashed, DNSName& before, DNSName& after) { @@ -2356,10 +2367,8 @@ bool LMDBBackend::getBeforeAndAfterNamesAbsolute(domainid_t id, const DNSName& q return false; } - if (co.getQType(key.getNoStripHeader()) == QType::NSEC3) { - deserializeFromBuffer(val.get(), lrr); - if (!lrr.ttl) // the kind of NSEC3 we need - break; + if (isNSEC3BackRecord(lrr, key, val)) { + break; // the kind of NSEC3 we need } if (cursor.prev(key, val)) { // hit beginning of database, again means something is wrong with it @@ -2375,10 +2384,8 @@ bool LMDBBackend::getBeforeAndAfterNamesAbsolute(domainid_t id, const DNSName& q return false; } for (;;) { - if (co.getQType(key.getNoStripHeader()) == QType::NSEC3) { - deserializeFromBuffer(val.get(), lrr); - if (!lrr.ttl) - break; + if (isNSEC3BackRecord(lrr, key, val)) { + break; } if (cursor.next(key, val) || co.getDomainID(key.getNoStripHeader()) != id) { @@ -2406,10 +2413,8 @@ bool LMDBBackend::getBeforeAndAfterNamesAbsolute(domainid_t id, const DNSName& q return false; } for (;;) { - if (co.getQType(key.getNoStripHeader()) == QType::NSEC3) { - deserializeFromBuffer(val.get(), lrr); - if (!lrr.ttl) - break; + if (isNSEC3BackRecord(lrr, key, val)) { + break; } if (cursor.next(key, val) || co.getDomainID(key.getNoStripHeader()) != id) { @@ -2426,13 +2431,10 @@ bool LMDBBackend::getBeforeAndAfterNamesAbsolute(domainid_t id, const DNSName& q // cout <<"Going backwards to find 'before'"<()).canonCompare(qname) && co.getQType(key.getNoStripHeader()) == QType::NSEC3) { - // cout<<"Potentially stopping traverse at "<< co.getQName(key.get()) <<", " << (co.getQName(key.get()).canonCompare(qname))<()) <()) == QType::NSEC3) { - deserializeFromBuffer(val.get(), lrr); - if (!lrr.ttl) { - break; - } + if (isNSEC3BackRecord(lrr, key, val)) { + break; } } after = co.getQName(key.getNoStripHeader()); diff --git a/modules/lmdbbackend/lmdbbackend.hh b/modules/lmdbbackend/lmdbbackend.hh index 1efa21aa67..5390f53987 100644 --- a/modules/lmdbbackend/lmdbbackend.hh +++ b/modules/lmdbbackend/lmdbbackend.hh @@ -338,6 +338,7 @@ private: void lookupInternal(const QType& type, const DNSName& qdomain, domainid_t zoneId, DNSPacket* p, bool include_disabled); bool getSerial(DomainInfo& di); + static bool isNSEC3BackRecord(LMDBResourceRecord& lrr, const MDBOutVal& key, const MDBOutVal& val); void writeNSEC3RecordPair(domainid_t domain_id, const DNSName& qname, const DNSName& ordername); bool get_list(DNSZoneRecord& rr);