summaryrefslogtreecommitdiff
path: root/src/dns/nm-dns-manager.c
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2020-04-20 14:51:42 +0200
committerThomas Haller <thaller@redhat.com>2020-04-20 15:55:51 +0200
commitd78dadc9ebceda78372efc98725b82560159982f (patch)
treee7e9d9dd76c10400d86c4897bfe8d6a7f6cb0420 /src/dns/nm-dns-manager.c
parentccb043d78ce83e6efad79b8cefd8c27d3e692332 (diff)
downloadNetworkManager-d78dadc9ebceda78372efc98725b82560159982f.tar.gz
dns: add trust-ad DNS option only if all contributing settings agree
https://bugzilla.redhat.com/show_bug.cgi?id=1825285 (cherry picked from commit 5e47fb630ba92fa7a5b98bebc94f830935109e0c)
Diffstat (limited to 'src/dns/nm-dns-manager.c')
-rw-r--r--src/dns/nm-dns-manager.c41
1 files changed, 33 insertions, 8 deletions
diff --git a/src/dns/nm-dns-manager.c b/src/dns/nm-dns-manager.c
index b40dd6b656..7686bb4baa 100644
--- a/src/dns/nm-dns-manager.c
+++ b/src/dns/nm-dns-manager.c
@@ -62,6 +62,7 @@ typedef struct {
GPtrArray *options;
const char *nis_domain;
GPtrArray *nis_servers;
+ NMTernary has_trust_ad;
} NMResolvConfData;
/*****************************************************************************/
@@ -410,8 +411,11 @@ merge_one_ip_config (NMResolvConfData *rc,
const NMIPConfig *ip_config)
{
int addr_family;
- guint num, i;
char buf[NM_UTILS_INET_ADDRSTRLEN + 50];
+ gboolean has_trust_ad;
+ guint num_nameservers;
+ guint num;
+ guint i;
addr_family = nm_ip_config_get_addr_family (ip_config);
@@ -419,8 +423,8 @@ merge_one_ip_config (NMResolvConfData *rc,
nm_assert (ifindex > 0);
nm_assert (ifindex == nm_ip_config_get_ifindex (ip_config));
- num = nm_ip_config_get_num_nameservers (ip_config);
- for (i = 0; i < num; i++) {
+ num_nameservers = nm_ip_config_get_num_nameservers (ip_config);
+ for (i = 0; i < num_nameservers; i++) {
const NMIPAddr *addr;
addr = nm_ip_config_get_nameserver (ip_config, i);
@@ -446,11 +450,28 @@ merge_one_ip_config (NMResolvConfData *rc,
add_dns_domains (rc->searches, ip_config, FALSE, TRUE);
+ has_trust_ad = FALSE;
num = nm_ip_config_get_num_dns_options (ip_config);
for (i = 0; i < num; i++) {
+ const char *option = nm_ip_config_get_dns_option (ip_config, i);
+
+ if (nm_streq (option, NM_SETTING_DNS_OPTION_TRUST_AD)) {
+ has_trust_ad = TRUE;
+ continue;
+ }
add_dns_option_item (rc->options,
nm_ip_config_get_dns_option (ip_config, i));
}
+ if (num_nameservers == 0) {
+ /* If the @ip_config contributes no DNS servers, ignore whether trust-ad is set or unset
+ * for this @ip_config. */
+ } else if (has_trust_ad) {
+ /* We only set has_trust_ad to TRUE, if all IP configs agree (or don't contribute).
+ * Once set to FALSE, it doesn't get reset. */
+ if (rc->has_trust_ad == NM_TERNARY_DEFAULT)
+ rc->has_trust_ad = NM_TERNARY_TRUE;
+ } else
+ rc->has_trust_ad = NM_TERNARY_FALSE;
if (addr_family == AF_INET) {
const NMIP4Config *ip4_config = (const NMIP4Config *) ip_config;
@@ -1106,11 +1127,12 @@ _collect_resolv_conf_data (NMDnsManager *self,
{
NMDnsManagerPrivate *priv;
NMResolvConfData rc = {
- .nameservers = g_ptr_array_new (),
- .searches = g_ptr_array_new (),
- .options = g_ptr_array_new (),
- .nis_domain = NULL,
- .nis_servers = g_ptr_array_new (),
+ .nameservers = g_ptr_array_new (),
+ .searches = g_ptr_array_new (),
+ .options = g_ptr_array_new (),
+ .nis_domain = NULL,
+ .nis_servers = g_ptr_array_new (),
+ .has_trust_ad = NM_TERNARY_DEFAULT,
};
priv = NM_DNS_MANAGER_GET_PRIVATE (self);
@@ -1174,6 +1196,9 @@ _collect_resolv_conf_data (NMDnsManager *self,
}
}
+ if (rc.has_trust_ad == NM_TERNARY_TRUE)
+ g_ptr_array_add (rc.options, NM_SETTING_DNS_OPTION_TRUST_AD);
+
*out_searches = _ptrarray_to_strv (rc.searches);
*out_options = _ptrarray_to_strv (rc.options);
*out_nameservers = _ptrarray_to_strv (rc.nameservers);