]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
GSQLBackend::getUnfreshSlaveInfos: log data errors properly
authorPieter Lexis <pieter.lexis@powerdns.com>
Tue, 12 Mar 2019 13:28:49 +0000 (14:28 +0100)
committerPieter Lexis <pieter.lexis@powerdns.com>
Thu, 21 Mar 2019 09:37:07 +0000 (10:37 +0100)
pdns/backends/gsql/gsqlbackend.cc

index 29c890a8ab4abd7108b5149f662c16fcef111e6f..9287010f5117b9423824230fde53c4512768e14c 100644 (file)
@@ -341,23 +341,51 @@ void GSQLBackend::getUnfreshSlaveInfos(vector<DomainInfo> *unfreshDomains)
 
   for(const auto& row : d_result) { // id,name,master,last_check
     DomainInfo sd;
-    ASSERT_ROW_COLUMNS("info-all-slaves-query", row, 4);
+    try {
+      ASSERT_ROW_COLUMNS("info-all-slaves-query", row, 4);
+    } catch(const PDNSException &e) {
+      g_log<<Logger::Warning<<e.reason<<endl;
+      continue;
+    }
+
+    try {
+      sd.zone = DNSName(row[1]);
+    } catch(const PDNSException &e) {
+      g_log<<Logger::Warning<<"Domain name '"<<row[1]<<"' is not a valid DNS name: "<<e.reason<<endl;
+      continue;
+    }
+
     try {
       sd.id=pdns_stou(row[0]);
-      sd.zone= DNSName(row[1]);
+    } catch (const std::exception &e) {
+      g_log<<Logger::Warning<<"Could not convert id ("<<row[0]<<") for domain '"<<sd.zone<<"' into an integer: "<<e.what()<<endl;
+      continue;
+    }
 
-      vector<string> masters;
-      stringtok(masters, row[2], ", \t");
-      for(const auto& m : masters)
+    vector<string> masters;
+    stringtok(masters, row[2], ", \t");
+    for(const auto& m : masters) {
+      try {
         sd.masters.emplace_back(m, 53);
+      } catch(const PDNSException &e) {
+        g_log<<Logger::Warning<<"Could not parse master address ("<<m<<") for zone '"<<sd.zone<<"': "<<e.reason<<endl;
+      }
+    }
+    if (sd.masters.empty()) {
+      g_log<<Logger::Warning<<"No masters for slave zone '"<<sd.zone<<"' found in the database"<<endl;
+      continue;
+    }
 
+    try {
       sd.last_check=pdns_stou(row[3]);
-      sd.backend=this;
-      sd.kind=DomainInfo::Slave;
-      allSlaves.push_back(sd);
-    } catch (...) {
+    } catch (const std::exception &e) {
+      g_log<<Logger::Warning<<"Could not convert last_check ("<<row[3]<<") for domain '"<<sd.zone<<"' into an integer: "<<e.what()<<endl;
       continue;
     }
+
+    sd.backend=this;
+    sd.kind=DomainInfo::Slave;
+    allSlaves.push_back(sd);
   }
 
   for (auto& slave : allSlaves) {