From a44d979fbf9fe10cbe8b1b22b210bc1dfd3dc47e Mon Sep 17 00:00:00 2001 From: Kees Monshouwer Date: Mon, 1 Feb 2021 20:18:52 +0100 Subject: [PATCH] auth: run deleteDomain() inside a transaction --- pdns/backends/gsql/gsqlbackend.cc | 4 ++++ pdns/pdnsutil.cc | 14 ++++++++++++-- pdns/ws-auth.cc | 13 +++++++++++-- 3 files changed, 27 insertions(+), 4 deletions(-) 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); -- 2.47.2