diff --git a/src/core/dns/nm-dns-manager.c b/src/core/dns/nm-dns-manager.c index fb38a44d9c..0f27ab23dc 100644 --- a/src/core/dns/nm-dns-manager.c +++ b/src/core/dns/nm-dns-manager.c @@ -110,6 +110,9 @@ typedef struct { NMConfig *config; + NMDnsConfigIPData *best_ip_config_4; + NMDnsConfigIPData *best_ip_config_6; + struct { guint64 ts; guint num_restarts; @@ -1863,6 +1866,7 @@ nm_dns_manager_set_ip_config(NMDnsManager *self, NMDnsConfigIPData *ip_data = NULL; int dns_priority; gboolean any_removed = FALSE; + NMDnsConfigIPData **p_best; g_return_val_if_fail(NM_IS_DNS_MANAGER(self), FALSE); g_return_val_if_fail(!l3cd || NM_IS_L3_CONFIG_DATA(l3cd), FALSE); @@ -1930,6 +1934,12 @@ nm_dns_manager_set_ip_config(NMDnsManager *self, } any_removed = TRUE; + + if (priv->best_ip_config_4 == ip_data_iter) + priv->best_ip_config_4 = NULL; + if (priv->best_ip_config_6 == ip_data_iter) + priv->best_ip_config_6 = NULL; + _dns_config_ip_data_free(ip_data_iter); } } @@ -1980,6 +1990,19 @@ nm_dns_manager_set_ip_config(NMDnsManager *self, changed = TRUE; } + p_best = NM_IS_IPv4(addr_family) ? &priv->best_ip_config_4 : &priv->best_ip_config_6; + if (ip_config_type == NM_DNS_IP_CONFIG_TYPE_BEST_DEVICE) { + /* Only one best-device per IP version is allowed */ + if (*p_best != ip_data) { + if (*p_best) + (*p_best)->ip_config_type = NM_DNS_IP_CONFIG_TYPE_DEFAULT; + *p_best = ip_data; + } + } else { + if (*p_best == ip_data) + *p_best = NULL; + } + if (changed) priv->ip_data_lst_need_sort = TRUE; @@ -2654,6 +2677,9 @@ dispose(GObject *object) g_clear_object(&priv->sd_resolve_plugin); _clear_plugin(self); + priv->best_ip_config_4 = NULL; + priv->best_ip_config_6 = NULL; + c_list_for_each_entry_safe (ip_data, ip_data_safe, &priv->ip_data_lst_head, ip_data_lst) _dns_config_ip_data_free(ip_data);