From: Miod Vallat Date: Mon, 30 Jun 2025 12:54:14 +0000 (+0200) Subject: More logic worth factoring in getBeforeAndAfterNames(). X-Git-Tag: rec-5.3.0-alpha2~29^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F15745%2Fhead;p=thirdparty%2Fpdns.git More logic worth factoring in getBeforeAndAfterNames(). Signed-off-by: Miod Vallat --- diff --git a/modules/lmdbbackend/lmdbbackend.cc b/modules/lmdbbackend/lmdbbackend.cc index baade7b953..17390a5ab4 100644 --- a/modules/lmdbbackend/lmdbbackend.cc +++ b/modules/lmdbbackend/lmdbbackend.cc @@ -2490,17 +2490,30 @@ bool LMDBBackend::getBeforeAndAfterNamesAbsolute(domainid_t id, const DNSName& q return getAfterForwardFromStart(cursor, key, val, id, after); } +// Return whether the given entry is an authoritative record, ignoring empty +// non terminal records. +bool LMDBBackend::isValidAuthRecord(const MDBOutVal& key, const MDBOutVal& val) +{ + LMDBResourceRecord lrr; + + deserializeFromBuffer(val.get(), lrr); + QType qtype = compoundOrdername::getQType(key.getNoStripHeader()).getCode(); + return qtype != QType::ENT && (lrr.auth || qtype == QType::NS); +} + bool LMDBBackend::getBeforeAndAfterNames(domainid_t domainId, const ZoneName& zonenameU, const DNSName& qname, DNSName& before, DNSName& after) { ZoneName zonename = zonenameU.makeLowerCase(); // cout << __PRETTY_FUNCTION__<< ": "<txn->getCursor(txn->db->dbi); MDBOutVal key, val; + + DNSName qname2 = qname.makeRelative(zonename); + string matchkey = co(domainId, qname2); // cout<<"Lower_bound for "<()).getCode() != 0 && compoundOrdername::getDomainID(key.getNoStripHeader()) == domainId && compoundOrdername::getQName(key.getNoStripHeader()) == qname2) { // don't match ENTs // cout << "Had an exact match!"<()) == domainId && key.getNoStripHeader().rfind(matchkey, 0) == 0) { continue; } - LMDBResourceRecord lrr; - deserializeFromBuffer(val.get(), lrr); - if (co.getQType(key.getNoStripHeader()).getCode() && (lrr.auth || co.getQType(key.getNoStripHeader()).getCode() == QType::NS)) + if (isValidAuthRecord(key, val)) { break; + } } if (rc != 0 || compoundOrdername::getDomainID(key.getNoStripHeader()) != domainId) { // cout << "We hit the end of the zone or database. 'after' is apex" << endl; @@ -2558,10 +2570,9 @@ bool LMDBBackend::getBeforeAndAfterNames(domainid_t domainId, const ZoneName& zo // "this can't happen" return false; } - LMDBResourceRecord lrr; - deserializeFromBuffer(val.get(), lrr); - if (co.getQType(key.getNoStripHeader()).getCode() && (lrr.auth || co.getQType(key.getNoStripHeader()).getCode() == QType::NS)) + if (isValidAuthRecord(key, val)) { break; + } } before = compoundOrdername::getQName(key.getNoStripHeader()) + zonename.operator const DNSName&(); @@ -2573,10 +2584,10 @@ bool LMDBBackend::getBeforeAndAfterNames(domainid_t domainId, const ZoneName& zo int skips = 0; for (;;) { - LMDBResourceRecord lrr; - deserializeFromBuffer(val.get(), lrr); - if (co.getQType(key.getNoStripHeader()).getCode() && (lrr.auth || co.getQType(key.getNoStripHeader()).getCode() == QType::NS)) { + if (isValidAuthRecord(key, val)) { after = compoundOrdername::getQName(key.getNoStripHeader()) + zonename.operator const DNSName&(); + // Note: change isValidAuthRecord to also return the LMDBResourceRecord if + // uncommenting these debug messages... // cout <<"Found auth ("<()).toString()<<", ttl = "<()) << endl; break; @@ -2603,11 +2614,10 @@ bool LMDBBackend::getBeforeAndAfterNames(domainid_t domainId, const ZoneName& zo return false; } before = compoundOrdername::getQName(key.getNoStripHeader()) + zonename.operator const DNSName&(); - LMDBResourceRecord lrr; - deserializeFromBuffer(val.get(), lrr); // cout<<"And before to "<