]> granicus.if.org Git - pdns/commitdiff
auth: Catch exception when parsing a zone's SOA in getUnfreshSlaveInfos()
authorRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 18 Feb 2019 15:16:04 +0000 (16:16 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 20 Mar 2019 14:17:01 +0000 (15:17 +0100)
(cherry picked from commit a6037f784da39d9cd784226fcc1a278383eb99a1)

pdns/backends/gsql/gsqlbackend.cc

index 848fb260e180a6c040b596d4e63fe6e2bb60b273..2b38ea7a06e6847598ec29fc866900ab1ee31a55 100644 (file)
@@ -370,31 +370,42 @@ void GSQLBackend::getUnfreshSlaveInfos(vector<DomainInfo> *unfreshDomains)
   }
 
   vector<DomainInfo> allSlaves;
-  int numanswers=d_result.size();
-  for(int n=0;n<numanswers;++n) { // id,name,master,last_check
+
+  for(const auto& row : d_result) { // id,name,master,last_check
     DomainInfo sd;
-    ASSERT_ROW_COLUMNS("info-all-slaves-query", d_result[n], 4);
-    sd.id=pdns_stou(d_result[n][0]);
+    ASSERT_ROW_COLUMNS("info-all-slaves-query", row, 4);
     try {
-      sd.zone= DNSName(d_result[n][1]);
+      sd.id=pdns_stou(row[0]);
+      sd.zone= DNSName(row[1]);
+
+      stringtok(sd.masters, row[2], ", \t");
+      sd.last_check=pdns_stou(row[3]);
+      sd.backend=this;
+      sd.kind=DomainInfo::Slave;
+      allSlaves.push_back(sd);
     } catch (...) {
       continue;
     }
-    stringtok(sd.masters, d_result[n][2], ", \t");
-    sd.last_check=pdns_stou(d_result[n][3]);
-    sd.backend=this;
-    sd.kind=DomainInfo::Slave;
-    allSlaves.push_back(sd);
   }
 
-  for(vector<DomainInfo>::iterator i=allSlaves.begin();i!=allSlaves.end();++i) {
-    SOAData sdata;
-    sdata.serial=0;
-    sdata.refresh=0;
-    getSOA(i->zone,sdata);
-    if((time_t)(i->last_check+sdata.refresh) < time(0)) {
-      i->serial=sdata.serial;
-      unfreshDomains->push_back(*i);
+  for (auto& slave : allSlaves) {
+    try {
+      SOAData sdata;
+      sdata.serial=0;
+      sdata.refresh=0;
+      getSOA(slave.zone, sdata);
+      if(static_cast<time_t>(slave.last_check + sdata.refresh) < time(nullptr)) {
+        slave.serial=sdata.serial;
+        unfreshDomains->push_back(slave);
+      }
+    }
+    catch(const std::exception& exp) {
+      L<<Logger::Warning<<"Error while parsing SOA data for slave zone '"<<slave.zone.toLogString()<<"': "<<exp.what()<<endl;
+      continue;
+    }
+    catch(...) {
+      L<<Logger::Warning<<"Error while parsing SOA data for slave zone '"<<slave.zone.toLogString()<<"', skipping"<<endl;
+      continue;
     }
   }
 }