From: Miod Vallat Date: Fri, 26 Sep 2025 07:31:33 +0000 (+0200) Subject: Provide more context in GeoIP YAML parsing failures. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=86ca82bd7c2479f366ab1bcf054cb3f2ab73a1a0;p=thirdparty%2Fpdns.git Provide more context in GeoIP YAML parsing failures. Fixes: #13064 Signed-off-by: Miod Vallat --- diff --git a/modules/geoipbackend/geoipbackend.cc b/modules/geoipbackend/geoipbackend.cc index 9a6d9cbbd..b34c4c062 100644 --- a/modules/geoipbackend/geoipbackend.cc +++ b/modules/geoipbackend/geoipbackend.cc @@ -232,12 +232,22 @@ void GeoIPBackend::setupNetmasks(const YAML::Node& domain, GeoIPDomain& dom) } } -bool GeoIPBackend::loadDomain(const YAML::Node& domain, domainid_t domainID, GeoIPDomain& dom) +bool GeoIPBackend::loadDomain(const std::string& origin, const YAML::Node& domain, domainid_t domainID, GeoIPDomain& dom) { try { dom.id = domainID; - dom.domain = ZoneName(domain["domain"].as()); - dom.ttl = domain["ttl"].as(); + if (auto node = domain["domain"]) { + dom.domain = ZoneName(node.as()); + } + else { + throw PDNSException("missing 'domain' node"); + } + if (auto node = domain["ttl"]) { + dom.ttl = node.as(); + } + else { + throw PDNSException("missing 'ttl' node"); + } for (auto recs = domain["records"].begin(); recs != domain["records"].end(); recs++) { ZoneName qname = ZoneName(recs->first.as()); @@ -355,11 +365,11 @@ bool GeoIPBackend::loadDomain(const YAML::Node& domain, domainid_t domainID, Geo } } catch (std::exception& ex) { - g_log << Logger::Error << ex.what() << endl; + g_log << Logger::Error << "Could not load zone from " << origin << ": " << ex.what() << endl; return false; } catch (PDNSException& ex) { - g_log << Logger::Error << ex.reason << endl; + g_log << Logger::Error << "Could not load zone from " << origin << ": " << ex.reason << endl; return false; } return true; @@ -375,17 +385,18 @@ void GeoIPBackend::loadDomainsFromDirectory(const std::string& dir, vector(domains.size()), dom)) { domains.push_back(dom); } } catch (std::exception& ex) { - g_log << Logger::Warning << "Cannot load zone from " << p << ": " << ex.what() << endl; + g_log << Logger::Warning << "Cannot load zone from " << path << ": " << ex.what() << endl; } } } @@ -438,9 +449,13 @@ void GeoIPBackend::initialize() d_global_custom_mapping = mapping.as>(); } + std::string origin; for (YAML::const_iterator _domain = config["domains"].begin(); _domain != config["domains"].end(); _domain++) { GeoIPDomain dom; - if (loadDomain(*_domain, tmp_domains.size(), dom)) { + if (origin.empty()) { + origin = "'domains' section in " + zonesFile; + } + if (loadDomain(origin, *_domain, static_cast(tmp_domains.size()), dom)) { tmp_domains.push_back(std::move(dom)); } } diff --git a/modules/geoipbackend/geoipbackend.hh b/modules/geoipbackend/geoipbackend.hh index 57f29a808..b597c7dc2 100644 --- a/modules/geoipbackend/geoipbackend.hh +++ b/modules/geoipbackend/geoipbackend.hh @@ -93,7 +93,7 @@ private: bool hasDNSSECkey(const ZoneName& name); bool lookup_static(const GeoIPDomain& dom, const DNSName& search, const QType& qtype, const DNSName& qdomain, const Netmask& addr, GeoIPNetmask& gl); void setupNetmasks(const YAML::Node& domain, GeoIPDomain& dom); - bool loadDomain(const YAML::Node& domain, domainid_t domainID, GeoIPDomain& dom); + bool loadDomain(const std::string& origin, const YAML::Node& domain, domainid_t domainID, GeoIPDomain& dom); void loadDomainsFromDirectory(const std::string& dir, vector& domains); vector d_result; vector d_files;