added logic to deal with dns replies to old dns requests --> no more consistency...
authorChristian Herdtweck <christian.herdtweck@intra2net.com>
Wed, 6 May 2015 15:02:33 +0000 (17:02 +0200)
committerChristian Herdtweck <christian.herdtweck@intra2net.com>
Wed, 6 May 2015 15:02:33 +0000 (17:02 +0200)
src/dns/dnsresolver.cpp

index eb05126..13a00eb 100644 (file)
@@ -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);
 }