]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Prevent TCP failures from affecting EDNS stats
authorMichał Kępień <michal@isc.org>
Thu, 31 Oct 2019 07:48:35 +0000 (08:48 +0100)
committerMichał Kępień <michal@isc.org>
Thu, 31 Oct 2019 08:55:06 +0000 (09:55 +0100)
EDNS mechanisms only apply to DNS over UDP.  Thus, errors encountered
while sending DNS queries over TCP must not influence EDNS timeout
statistics.

(cherry picked from commit fce3c93ea2ac63cd06faf817abf3c775fe11a33d)

bin/tests/system/legacy/tests.sh
lib/dns/resolver.c

index abc1ca7682a1f8bb22c502e2726d3f10bab281d8..79254e0db261b0089f0e46aaae17775688758ce7 100755 (executable)
@@ -241,6 +241,18 @@ fi
 if [ $ret != 0 ]; then echo_i "failed"; fi
 status=`expr $status + $ret`
 
+n=`expr $n + 1`
+echo_i "checking that TCP failures do not influence EDNS statistics in the ADB ($n)"
+ret=0
+rndc_dumpdb ns1 -adb || ret=1
+timeouts512=`sed -n "s|.*10\.53\.0\.7.*\[edns \([0-9/][0-9/]*\).*|\1|p" ns1/named_dump.db.test$n | awk -F/ '{print $NF}'`
+if [ $timeouts512 -ne 0 ]; then
+       echo_i "512-byte EDNS timeouts according to ADB: $timeouts512, expected: 0"
+       ret=1
+fi
+if [ $ret != 0 ]; then echo_i "failed"; fi
+status=`expr $status + $ret`
+
 if $SHELL ../testcrypto.sh > /dev/null 2>&1
 then
     $PERL $SYSTEMTESTTOP/stop.pl --use-rndc --port ${CONTROLPORT} legacy ns1
index 7c65fd9956ce8ab158f0419cc5ad5ac19b1ac034..4cd51d78acd0da54c01d0af8a44853eff7e26d3e 100644 (file)
@@ -890,6 +890,25 @@ resquery_destroy(resquery_t **queryp) {
                empty_bucket(res);
 }
 
+/*%
+ * Update EDNS statistics for a server after not getting a response to a UDP
+ * query sent to it.
+ */
+static void
+update_edns_stats(resquery_t *query) {
+       fetchctx_t *fctx = query->fctx;
+
+       if ((query->options & DNS_FETCHOPT_TCP) != 0) {
+               return;
+       }
+
+       if ((query->options & DNS_FETCHOPT_NOEDNS0) == 0) {
+               dns_adb_ednsto(fctx->adb, query->addrinfo, query->udpsize);
+       } else {
+               dns_adb_timeout(fctx->adb, query->addrinfo);
+       }
+}
+
 static void
 fctx_cancelquery(resquery_t **queryp, dns_dispatchevent_t **deventp,
                 isc_time_t *finish, bool no_response,
@@ -950,11 +969,7 @@ fctx_cancelquery(resquery_t **queryp, dns_dispatchevent_t **deventp,
                        uint32_t value;
                        uint32_t mask;
 
-                       if ((query->options & DNS_FETCHOPT_NOEDNS0) == 0)
-                               dns_adb_ednsto(fctx->adb, query->addrinfo,
-                                              query->udpsize);
-                       else
-                               dns_adb_timeout(fctx->adb, query->addrinfo);
+                       update_edns_stats(query);
 
                        /*
                         * If "forward first;" is used and a forwarder timed