From: Pieter Lexis Date: Fri, 24 Aug 2018 14:50:22 +0000 (+0200) Subject: ixfrutils: add timeout to readSerialFromMaster X-Git-Tag: dnsdist-1.3.3~147^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2dfb13fe5c6e1967dd2a79ccc9c336132f534e81;p=thirdparty%2Fpdns.git ixfrutils: add timeout to readSerialFromMaster Make the error messages better in ixfrdist --- diff --git a/pdns/ixfrdist.cc b/pdns/ixfrdist.cc index 4a768ddf4b..24b930aff7 100644 --- a/pdns/ixfrdist.cc +++ b/pdns/ixfrdist.cc @@ -287,7 +287,7 @@ void updateThread(const string& workdir, const uint16_t& keep, const uint16_t& a g_log<& sr, const TSIGTriplet& tt) +uint32_t getSerialFromMaster(const ComboAddress& master, const DNSName& zone, shared_ptr& sr, const TSIGTriplet& tt, const uint16_t timeout) { vector packet; DNSPacketWriter pw(packet, zone, QType::SOA); @@ -49,10 +49,14 @@ uint32_t getSerialFromMaster(const ComboAddress& master, const DNSName& zone, sh s.writen(msg); string reply; - s.read(reply); + char buf[4096]; + // will throw a NetworkError on timeout + s.readWithTimeout(buf, sizeof(buf), timeout); + reply.assign(buf); + MOADNSParser mdp(false, reply); if(mdp.d_header.rcode) { - throw std::runtime_error("Unable to retrieve SOA serial from master '"+master.toStringWithPort()+"': "+RCode::to_s(mdp.d_header.rcode)); + throw std::runtime_error("RCODE from response is not NoError but " + RCode::to_s(mdp.d_header.rcode)); } for(const auto& r: mdp.d_answers) { if(r.first.d_type == QType::SOA) { diff --git a/pdns/ixfrutils.hh b/pdns/ixfrutils.hh index f7e0c5a848..1f31c974ce 100644 --- a/pdns/ixfrutils.hh +++ b/pdns/ixfrutils.hh @@ -49,7 +49,7 @@ typedef multi_index_container < > /* indexed_by */ > /* multi_index_container */ records_t; -uint32_t getSerialFromMaster(const ComboAddress& master, const DNSName& zone, shared_ptr& sr, const TSIGTriplet& tt = TSIGTriplet()); +uint32_t getSerialFromMaster(const ComboAddress& master, const DNSName& zone, shared_ptr& sr, const TSIGTriplet& tt = TSIGTriplet(), const uint16_t timeout = 2); uint32_t getSerialsFromDir(const std::string& dir); uint32_t getSerialFromRecords(const records_t& records, DNSRecord& soaret); void writeZoneToDisk(const records_t& records, const DNSName& zone, const std::string& directory);