]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Use uint32_t for serial in calculateSOASerial 5068/head
authorPieter Lexis <pieter.lexis@powerdns.com>
Mon, 14 Aug 2017 14:46:28 +0000 (16:46 +0200)
committerPieter Lexis <pieter.lexis@powerdns.com>
Wed, 6 Dec 2017 08:59:29 +0000 (09:59 +0100)
`time_t` can be bigger or be negative, which could lead to overflow/underflow issues.

Closes #1010

modules/remotebackend/remotebackend.cc
modules/remotebackend/remotebackend.hh
modules/remotebackend/test-remotebackend.cc
pdns/backends/gsql/gsqlbackend.cc
pdns/backends/gsql/gsqlbackend.hh
pdns/dnsbackend.cc
pdns/dnsbackend.hh

index ef2fbb2c6848e531d132f005a335c040c574339c..c3d694d11d45efb04f9830451b79f059750caa4f 100644 (file)
@@ -845,7 +845,7 @@ bool RemoteBackend::abortTransaction() {
    return true;
 }
 
-bool RemoteBackend::calculateSOASerial(const DNSName& domain, const SOAData& sd, time_t& serial) {
+bool RemoteBackend::calculateSOASerial(const DNSName& domain, const SOAData& sd, uint32_t& serial) {
    Json query = Json::object{
      { "method", "calculateSOASerial" },
      { "parameters", Json::object{
index b44af82c98c27d5a08b36795c1bdb9148093e70e..efec16bfdcf9292f0fb6fd1b1822f20385497441 100644 (file)
@@ -180,7 +180,7 @@ class RemoteBackend : public DNSBackend
   bool startTransaction(const DNSName& domain, int domain_id) override;
   bool commitTransaction() override;
   bool abortTransaction() override;
-  bool calculateSOASerial(const DNSName& domain, const SOAData& sd, time_t& serial) override;
+  bool calculateSOASerial(const DNSName& domain, const SOAData& sd, uint32_t& serial) override;
   bool setTSIGKey(const DNSName& name, const DNSName& algorithm, const string& content) override;
   bool deleteTSIGKey(const DNSName& name) override;
   bool getTSIGKeys(std::vector< struct TSIGKey > &keys) override;
index 48a240ace10e86ed2252c3276add03ed3cddd5c8..aed51ff4569342aeedce807d022c7810a0013c84 100644 (file)
@@ -326,7 +326,7 @@ BOOST_AUTO_TEST_CASE(test_method_abortTransaction) {
 
 BOOST_AUTO_TEST_CASE(test_method_calculateSOASerial) {
    SOAData sd;
-   time_t serial;
+   uint32_t serial;
  
    be->getSOA(DNSName("unit.test."),sd);
    BOOST_CHECK(be->calculateSOASerial(DNSName("unit.test."),sd,serial));
index 848fb260e180a6c040b596d4e63fe6e2bb60b273..24f2d00708f529cbef78a3120176e5122eff7c36 100644 (file)
@@ -1506,7 +1506,7 @@ bool GSQLBackend::abortTransaction()
   return true;
 }
 
-bool GSQLBackend::calculateSOASerial(const DNSName& domain, const SOAData& sd, time_t& serial)
+bool GSQLBackend::calculateSOASerial(const DNSName& domain, const SOAData& sd, uint32_t& serial)
 {
   if (d_ZoneLastChangeQuery.empty()) {
     // query not set => fall back to default impl
index 7a6fcff9091655e080fe1b19abc27193c7e37cbd..cd591076f004f4bc78d965789e17507293e44b01 100644 (file)
@@ -207,7 +207,7 @@ public:
   bool updateEmptyNonTerminals(uint32_t domain_id, set<DNSName>& insert ,set<DNSName>& erase, bool remove) override;
   bool doesDNSSEC() override;
 
-  bool calculateSOASerial(const DNSName& domain, const SOAData& sd, time_t& serial) override;
+  bool calculateSOASerial(const DNSName& domain, const SOAData& sd, uint32_t& serial) override;
 
   bool replaceRRSet(uint32_t domain_id, const DNSName& qname, const QType& qt, const vector<DNSResourceRecord>& rrset) override;
   bool listSubZone(const DNSName &zone, int domain_id) override;
index 5fca2b903de903a6480c3c3b47fededcdc7bbe8d..660d872efc99b7f4434ae831187f916f903c740e 100644 (file)
@@ -250,7 +250,7 @@ bool DNSBackend::getSOA(const DNSName &domain, SOAData &sd)
   if(!sd.serial) { // magic time!
     DLOG(L<<Logger::Warning<<"Doing SOA serial number autocalculation for "<<rr.qname<<endl);
 
-    time_t serial;
+    uint32_t serial = 0;
     if (calculateSOASerial(domain, sd, serial)) {
       sd.serial = serial;
       //DLOG(L<<"autocalculated soa serialnumber for "<<rr.qname<<" is "<<newest<<endl);
@@ -330,12 +330,12 @@ bool DNSBackend::getBeforeAndAfterNames(uint32_t id, const DNSName& zonename, co
  * \param sd Information about the SOA record already available
  * \param serial Output parameter. Only inspected when we return true
  */
-bool DNSBackend::calculateSOASerial(const DNSName& domain, const SOAData& sd, time_t& serial)
+bool DNSBackend::calculateSOASerial(const DNSName& domain, const SOAData& sd, uint32_t& serial)
 {
     // we do this by listing the domain and taking the maximum last modified timestamp
 
     DNSResourceRecord i;
-    time_t newest=0;
+    uint32_t newest=0;
 
     if(!(this->list(domain, sd.domain_id))) {
       DLOG(L<<Logger::Warning<<"Backend error trying to determine magic serial number of zone '"<<domain<<"'"<<endl);
index 16ec7c5c4a5ab8820b1b70d5c1674cab6f442328..069b89d81ac6a86dbded1a9da742b4abd8d25926 100644 (file)
@@ -128,7 +128,7 @@ public:
   virtual bool getSOA(const DNSName &name, SOAData &soadata);
 
   //! Calculates a SOA serial for the zone and stores it in the third argument.
-  virtual bool calculateSOASerial(const DNSName& domain, const SOAData& sd, time_t& serial);
+  virtual bool calculateSOASerial(const DNSName& domain, const SOAData& sd, uint32_t& serial);
 
   virtual bool replaceRRSet(uint32_t domain_id, const DNSName& qname, const QType& qt, const vector<DNSResourceRecord>& rrset)
   {