From: Christian Herdtweck Date: Wed, 6 May 2015 15:02:33 +0000 (+0200) Subject: added logic to deal with dns replies to old dns requests --> no more consistency... X-Git-Url: http://developer.intra2net.com/git/?p=pingcheck;a=commitdiff_plain;h=3f489614d188a52497dad8ab7f8ee63bf01e9fe4 added logic to deal with dns replies to old dns requests --> no more consistency check failures for now --- diff --git a/src/dns/dnsresolver.cpp b/src/dns/dnsresolver.cpp index eb05126..13a00eb 100644 --- a/src/dns/dnsresolver.cpp +++ b/src/dns/dnsresolver.cpp @@ -213,10 +213,24 @@ void DnsResolver::handle_dns_result(const int recursion_count, result_message.decode( ReceiveBuffer ); // check ID - if (RequestId != result_message.id()) + if (RequestId == 0) + { // system DNS or firewall might have longer timeout than me + // --> might receive replies for old requests whose time-out has expired + // --> have already called callbacks etc, so nothing to do with result + // TODO: did receive probably same data several times --> reset buffer? + GlobalLogger.info() << LogPrefix << "Ignoring reply to old DNS request " + << "(reply has ID " << std::showbase << std::hex + << result_message.id() << " or buffer not reset)"; + return; + } + else if (RequestId != result_message.id()) + { GlobalLogger.info() << LogPrefix << "Received answer for request ID " << std::showbase << std::hex << result_message.id() - << " but expected ID " << RequestId; + << " but expected ID " << RequestId << " --> ignore and retry"; + schedule_retry(recursion_count); + return; + } else GlobalLogger.debug() << LogPrefix << "Result has correct ID " << std::showbase << std::hex << RequestId; @@ -371,6 +385,7 @@ void DnsResolver::handle_unavailable(const int recursion_count) LongtermTimerIsActive = true; // for now, admit failure + RequestId = 0; // do not accept answers from old requests bool was_success = false; finalize_resolve(was_success, recursion_count); }