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
(cherry picked from commit 6edc737173)
This commit is contained in:
Beniamino Galvani 2015-04-01 08:26:29 +02:00
parent 474848c238
commit 79c80f00cc

View file

@ -131,7 +131,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++) {
@ -139,18 +139,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);
@ -159,6 +151,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++) {
@ -176,7 +179,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);
@ -201,18 +204,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);
@ -220,6 +215,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);
}
}
}