]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolved: when DNSSEC mode is disabled, don't go beyond EDNS0 feature level
authorLennart Poettering <lennart@poettering.net>
Wed, 15 Feb 2017 15:01:53 +0000 (16:01 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 17 Feb 2017 09:25:15 +0000 (10:25 +0100)
There's no point in talking to a server in DNSSEC mode when we don't
actually want to verify anything.

See: #5352

src/resolve/resolved-dns-server.c

index 9f81798f6eb3ca53d7b2233d70be542f1253bb54..2df917e61e1874ae954320b63681ea50e540e0d7 100644 (file)
@@ -399,12 +399,24 @@ static bool dns_server_grace_period_expired(DnsServer *s) {
 }
 
 DnsServerFeatureLevel dns_server_possible_feature_level(DnsServer *s) {
+        DnsServerFeatureLevel best;
+
         assert(s);
 
-        if (s->possible_feature_level != DNS_SERVER_FEATURE_LEVEL_BEST &&
-            dns_server_grace_period_expired(s)) {
+        /* Determine the best feature level we care about. If DNSSEC mode is off there's no point in using anything
+         * better than EDNS0, hence don't even try. */
+        best = dns_server_get_dnssec_mode(s) == DNSSEC_NO ?
+                DNS_SERVER_FEATURE_LEVEL_EDNS0 :
+                DNS_SERVER_FEATURE_LEVEL_BEST;
+
+        /* Clamp the feature level the highest level we care about. The DNSSEC mode might have changed since the last
+         * time, hence let's downgrade if we are still at a higher level. */
+        if (s->possible_feature_level > best)
+                s->possible_feature_level = best;
+
+        if (s->possible_feature_level < best && dns_server_grace_period_expired(s)) {
 
-                s->possible_feature_level = DNS_SERVER_FEATURE_LEVEL_BEST;
+                s->possible_feature_level = best;
 
                 dns_server_reset_counters(s);