]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolve: also compare port and SNI in dns_server_find()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 13 Jul 2020 00:05:15 +0000 (09:05 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 20 Jul 2020 19:04:49 +0000 (04:04 +0900)
src/resolve/resolved-conf.c
src/resolve/resolved-dns-server.c
src/resolve/resolved-dns-server.h
src/resolve/resolved-link-bus.c
src/resolve/resolved-link.c

index 5df39b1b89e530be35ebcd0b7a81cdc635b9b0cd..6b99271245716d25f6f46ae02d43de4e92bb341a 100644 (file)
@@ -41,6 +41,9 @@ static int manager_add_dns_server_by_string(Manager *m, DnsServerType type, cons
         if (r < 0)
                 return r;
 
+        if (IN_SET(port, 53, 853))
+                port = 0;
+
         /* Silently filter out 0.0.0.0 and 127.0.0.53 (our own stub DNS listener) */
         if (!dns_server_address_valid(family, &address))
                 return 0;
@@ -51,7 +54,7 @@ static int manager_add_dns_server_by_string(Manager *m, DnsServerType type, cons
                 port = 0;
 
         /* Filter out duplicates */
-        s = dns_server_find(manager_get_first_dns_server(m, type), family, &address, ifindex);
+        s = dns_server_find(manager_get_first_dns_server(m, type), family, &address, port, ifindex, server_name);
         if (s) {
                 /*
                  * Drop the marker. This is used to find the servers
index b4f2a8c97f4f3a9d4739d48142bf500ceda7ea88..1bd9c6fcbdbe79ba0d8a0839a7c51c081675d93b 100644 (file)
@@ -666,11 +666,15 @@ void dns_server_mark_all(DnsServer *first) {
         dns_server_mark_all(first->servers_next);
 }
 
-DnsServer *dns_server_find(DnsServer *first, int family, const union in_addr_union *in_addr, int ifindex) {
+DnsServer *dns_server_find(DnsServer *first, int family, const union in_addr_union *in_addr, uint16_t port, int ifindex, const char *name) {
         DnsServer *s;
 
         LIST_FOREACH(servers, s, first)
-                if (s->family == family && in_addr_equal(family, &s->address, in_addr) > 0 && s->ifindex == ifindex)
+                if (s->family == family &&
+                    in_addr_equal(family, &s->address, in_addr) > 0 &&
+                    s->port == port &&
+                    s->ifindex == ifindex &&
+                    streq_ptr(s->server_name, name))
                         return s;
 
         return NULL;
index 126a52ae6f36a96743307d08b3b1dcecc3656650..4109c29452d8a76126980afcd9f1d3b533220459 100644 (file)
@@ -131,7 +131,7 @@ bool dns_server_dnssec_supported(DnsServer *server);
 
 void dns_server_warn_downgrade(DnsServer *server);
 
-DnsServer *dns_server_find(DnsServer *first, int family, const union in_addr_union *in_addr, int ifindex);
+DnsServer *dns_server_find(DnsServer *first, int family, const union in_addr_union *in_addr, uint16_t port, int ifindex, const char *name);
 
 void dns_server_unlink_all(DnsServer *first);
 void dns_server_unlink_marked(DnsServer *first);
index 62afe698c6eab0d10c6a451b08e6477f2c878609..1694b1aa5a716bd3ff4c1de818675ee8d3f5c22b 100644 (file)
@@ -281,7 +281,7 @@ int bus_link_method_set_dns_servers(sd_bus_message *message, void *userdata, sd_
         for (i = 0; i < n; i++) {
                 DnsServer *s;
 
-                s = dns_server_find(l->dns_servers, dns[i].family, &dns[i].address, 0);
+                s = dns_server_find(l->dns_servers, dns[i].family, &dns[i].address, 0, 0, NULL);
                 if (s)
                         dns_server_move_back_and_unmark(s);
                 else {
index 95f64700b6e9b1aa2d8f5ab3952f8e6ea0f0e27a..3679ca0703aecfca9a83c4f3cdba93a93b94e7e3 100644 (file)
@@ -263,7 +263,7 @@ static int link_update_dns_server_one(Link *l, const char *name) {
         if (r < 0)
                 return r;
 
-        s = dns_server_find(l->dns_servers, family, &a, 0);
+        s = dns_server_find(l->dns_servers, family, &a, 0, 0, NULL);
         if (s) {
                 dns_server_move_back_and_unmark(s);
                 return 0;