diff options
author | Beniamino Galvani <bgalvani@redhat.com> | 2015-04-01 08:26:29 +0200 |
---|---|---|
committer | Beniamino Galvani <bgalvani@redhat.com> | 2015-05-08 10:21:28 +0200 |
commit | 6edc7371734315d57de020193102938846b2eb9e (patch) | |
tree | 36d52a570450ce5214efa62fdd8d93a32ea088c4 | |
parent | 33527341b1e35034a4f1736df4bc98f8ac8418ab (diff) | |
download | NetworkManager-6edc7371734315d57de020193102938846b2eb9e.tar.gz |
dns: don't override DHCP-supplied search order with domain
NM always prepends the list of DNS domains received through DHCP to
the search list in /etc/resolv.conf, overriding the DHCP-supplied DNS
domain search order. This behavior is not entirely correct since it
changes the search order provided by system administrators.
We cannot simply avoid adding the DNS domain list to the search list
because this would break some configurations that rely on the 'domain'
option to deliver the search list.
This patch modifies the behavior of DNS manager to:
- insert the DHCP-provided 'domain' at the end of 'searches' option
so that 'searches' is always preferred
- ignore 'domain' if 'searches' option exists and 'domain' is a
single domain
https://bugzilla.gnome.org/show_bug.cgi?id=748900
-rw-r--r-- | src/dns-manager/nm-dns-manager.c | 54 |
1 files changed, 30 insertions, 24 deletions
diff --git a/src/dns-manager/nm-dns-manager.c b/src/dns-manager/nm-dns-manager.c index a403a85faf..430df122fa 100644 --- a/src/dns-manager/nm-dns-manager.c +++ b/src/dns-manager/nm-dns-manager.c @@ -145,7 +145,7 @@ add_string_item (GPtrArray *array, const char *str) static void merge_one_ip4_config (NMResolvConfData *rc, NMIP4Config *src) { - guint32 num, i; + guint32 num, num_domains, num_searches, i; num = nm_ip4_config_get_num_nameservers (src); for (i = 0; i < num; i++) { @@ -153,18 +153,10 @@ merge_one_ip4_config (NMResolvConfData *rc, NMIP4Config *src) nm_utils_inet4_ntop (nm_ip4_config_get_nameserver (src, i), NULL)); } - num = nm_ip4_config_get_num_domains (src); - for (i = 0; i < num; i++) { - const char *domain; + num_domains = nm_ip4_config_get_num_domains (src); + num_searches = nm_ip4_config_get_num_searches (src); - domain = nm_ip4_config_get_domain (src, i); - if (!DOMAIN_IS_VALID (domain)) - continue; - add_string_item (rc->searches, domain); - } - - num = nm_ip4_config_get_num_searches (src); - for (i = 0; i < num; i++) { + for (i = 0; i < num_searches; i++) { const char *search; search = nm_ip4_config_get_search (src, i); @@ -173,6 +165,17 @@ merge_one_ip4_config (NMResolvConfData *rc, NMIP4Config *src) add_string_item (rc->searches, search); } + if (num_domains > 1 || !num_searches) { + for (i = 0; i < num_domains; i++) { + const char *domain; + + domain = nm_ip4_config_get_domain (src, i); + if (!DOMAIN_IS_VALID (domain)) + continue; + add_string_item (rc->searches, domain); + } + } + /* NIS stuff */ num = nm_ip4_config_get_num_nis_servers (src); for (i = 0; i < num; i++) { @@ -190,7 +193,7 @@ merge_one_ip4_config (NMResolvConfData *rc, NMIP4Config *src) static void merge_one_ip6_config (NMResolvConfData *rc, NMIP6Config *src) { - guint32 num, i; + guint32 num, num_domains, num_searches, i; const char *iface; iface = g_object_get_data (G_OBJECT (src), IP_CONFIG_IFACE_TAG); @@ -215,18 +218,10 @@ merge_one_ip6_config (NMResolvConfData *rc, NMIP6Config *src) add_string_item (rc->nameservers, buf); } - num = nm_ip6_config_get_num_domains (src); - for (i = 0; i < num; i++) { - const char *domain; + num_domains = nm_ip6_config_get_num_domains (src); + num_searches = nm_ip6_config_get_num_searches (src); - domain = nm_ip6_config_get_domain (src, i); - if (!DOMAIN_IS_VALID (domain)) - continue; - add_string_item (rc->searches, domain); - } - - num = nm_ip6_config_get_num_searches (src); - for (i = 0; i < num; i++) { + for (i = 0; i < num_searches; i++) { const char *search; search = nm_ip6_config_get_search (src, i); @@ -234,6 +229,17 @@ merge_one_ip6_config (NMResolvConfData *rc, NMIP6Config *src) continue; add_string_item (rc->searches, search); } + + if (num_domains > 1 || !num_searches) { + for (i = 0; i < num_domains; i++) { + const char *domain; + + domain = nm_ip6_config_get_domain (src, i); + if (!DOMAIN_IS_VALID (domain)) + continue; + add_string_item (rc->searches, domain); + } + } } |