]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolved: filter stub listeners in manager_get_dns_server()
authorTom Yan <tom.ty89@gmail.com>
Wed, 8 Dec 2021 02:53:07 +0000 (10:53 +0800)
committerTom Yan <tom.ty89@gmail.com>
Mon, 13 Dec 2021 15:08:40 +0000 (23:08 +0800)
Commit 49ef064c8dcd8ed12d98e6c705e676babade0897 attempts to handle
"stub loop" by switching to the next server *after the query has
been made*.

The approach may be good enough for link scopes. However, for the
manager / global scope, it is not. First of all, there are more than
one types (SYSTEM and FALLBACK) of servers it can use. Also, whether
those of type FALLBACK should be used depends.

Besides, dns_scope_good_domain() determines whether things should
be routed to a scope by checking whether the scope has a server.
The decision made would be incorrect if stubs were not filtered
beforehand.

Therefore, to avoid failing query unnecessarily, and to make sure
that extra stub listeners will not trigger unexpected and/or
inconsistent behavior, make manager_get_dns_server() do what it
should have done.

src/resolve/resolved-dns-server.c

index 7d180378b61589a4ff176602cbab32802e56ddc5..cd755b13d4c073bed91be0b57e30300801748d50 100644 (file)
@@ -875,9 +875,18 @@ DnsServer *manager_get_dns_server(Manager *m) {
         manager_read_resolv_conf(m);
 
         /* If no DNS server was chosen so far, pick the first one */
-        if (!m->current_dns_server)
+        if (!m->current_dns_server ||
+            /* In case m->current_dns_server != m->dns_servers */
+            manager_server_is_stub(m, m->current_dns_server))
                 manager_set_dns_server(m, m->dns_servers);
 
+        while (m->current_dns_server &&
+               manager_server_is_stub(m, m->current_dns_server)) {
+                manager_next_dns_server(m, NULL);
+                if (m->current_dns_server == m->dns_servers)
+                        manager_set_dns_server(m, NULL);
+        }
+
         if (!m->current_dns_server) {
                 bool found = false;