From: Kees Monshouwer Date: Mon, 1 Feb 2021 19:18:52 +0000 (+0100) Subject: auth: run deleteDomain() inside a transaction X-Git-Tag: dnsdist-1.6.0-alpha2~70^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a44d979fbf9fe10cbe8b1b22b210bc1dfd3dc47e;p=thirdparty%2Fpdns.git auth: run deleteDomain() inside a transaction --- diff --git a/pdns/backends/gsql/gsqlbackend.cc b/pdns/backends/gsql/gsqlbackend.cc index bcb351769b..9b04247980 100644 --- a/pdns/backends/gsql/gsqlbackend.cc +++ b/pdns/backends/gsql/gsqlbackend.cc @@ -1328,6 +1328,10 @@ bool GSQLBackend::createSlaveDomain(const string &ip, const DNSName &domain, con bool GSQLBackend::deleteDomain(const DNSName &domain) { + if (!d_inTransaction) { + throw PDNSException("deleteDomain called outside of transaction"); + } + DomainInfo di; if (!getDomainInfo(domain, di)) { return false; diff --git a/pdns/pdnsutil.cc b/pdns/pdnsutil.cc index eb7f77cfa3..78fc899007 100644 --- a/pdns/pdnsutil.cc +++ b/pdns/pdnsutil.cc @@ -819,8 +819,18 @@ static int deleteZone(const DNSName &zone) { return EXIT_FAILURE; } - if(di.backend->deleteDomain(zone)) - return EXIT_SUCCESS; + di.backend->startTransaction(zone, -1); + try { + if(di.backend->deleteDomain(zone)) { + di.backend->commitTransaction(); + return EXIT_SUCCESS; + } + } catch (...) { + di.backend->abortTransaction(); + throw; + } + + di.backend->abortTransaction(); cerr<<"Failed to delete domain '"<method == "DELETE") { // delete domain - if(!di.backend->deleteDomain(zonename)) - throw ApiException("Deleting domain '"+zonename.toString()+"' failed: backend delete failed/unsupported"); + + di.backend->startTransaction(zonename, -1); + try { + if(!di.backend->deleteDomain(zonename)) + throw ApiException("Deleting domain '"+zonename.toString()+"' failed: backend delete failed/unsupported"); + + di.backend->commitTransaction(); + } catch (...) { + di.backend->abortTransaction(); + throw; + } // clear caches DNSSECKeeper::clearCaches(zonename);