From 391ca6494fad04458de9ab9d60b3fc4f31737250 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Date: Tue, 17 Dec 2024 23:15:56 +0100 Subject: [PATCH] pdnsutil {add-record,delete-rrset}: Don't append ZONE if NAME ends with . or ZONE If a NAME ends with a . it is to be understood as an absolute name and appending the zone is not intuitive then. Note this changes behaviour for calls like: pdnsutil --config-dir=configs/auth add-record example.net . NS 1.2.3.4 which added the NS record to the zone's apex before and is likely an error now. Also make both pdnsutil --config-dir=configs/auth add-record example.net www.example.net A 1.2.3.5 pdnsutil --config-dir=configs/auth add-record example.net www A 1.2.3.5 add www.example.net. to the example.net zone. Closes: https://github.com/PowerDNS/pdns/issues/8595 --- pdns/pdnsutil.cc | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/pdns/pdnsutil.cc b/pdns/pdnsutil.cc index ed19662297cd..92d010b0d786 100644 --- a/pdns/pdnsutil.cc +++ b/pdns/pdnsutil.cc @@ -1597,10 +1597,14 @@ static int addOrReplaceRecord(bool addOrReplace, const vector& cmds) { vector newrrs; DNSName zone(cmds.at(1)); DNSName name; - if (cmds.at(2) == "@") - name=zone; - else + if (cmds.at(2) == "@") { + name = zone; + } else if (isCanonical(cmds.at(2)) || boost::ends_with(cmds.at(2), cmds.at(1))) { + name = DNSName(cmds.at(2)); + } else { + cerr << "Name " << cmds.at(2) << "' does not fit into zone '" << zone << "'. Interpreting as relative name." << endl; name = DNSName(cmds.at(2)) + zone; + } rr.qtype = DNSRecordContent::TypeToNumber(cmds.at(3)); rr.ttl = ::arg().asNum("default-ttl"); @@ -1735,10 +1739,14 @@ static int deleteRRSet(const std::string& zone_, const std::string& name_, const } DNSName name; - if(name_=="@") - name=zone; - else - name=DNSName(name_)+zone; + if (name_ == "@") { + name = zone; + } else if (isCanonical(name_) || boost::ends_with(name_, zone_)) { + name = DNSName(name_); + } else { + cerr << "Name " << name_ << "' does not fit into zone '" << zone << "'. Interpreting as relative name." << endl; + name = DNSName(name_) + zone; + } QType qt(QType::chartocode(type_.c_str())); di.backend->startTransaction(zone, -1);