From fc8cc8393ed796ecfd21762929e06d3bfe965062 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Fri, 13 May 2016 16:44:06 +0200 Subject: [PATCH] dns: properly remove existing configurations When a configuration is replaced by another with different metadata, disconnect signals and clear @best_conf pointers. Also, the check in remove_ip_config() was wrong. Fixes: 8e6d442477c4c67672da62f1a7100c9951e85a86 Fixes: 570d73979beb40cde22546a31ac175d04f53026d --- src/dns-manager/nm-dns-manager.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/dns-manager/nm-dns-manager.c b/src/dns-manager/nm-dns-manager.c index 67913c376e..2187e7a6b0 100644 --- a/src/dns-manager/nm-dns-manager.c +++ b/src/dns-manager/nm-dns-manager.c @@ -1220,6 +1220,19 @@ ip_config_dns_priority_changed (gpointer config, NM_DNS_MANAGER_GET_PRIVATE (self)->need_sort = TRUE; } +static void +forget_data (NMDnsManager *self, NMDnsIPConfigData *data) +{ + NMDnsManagerPrivate *priv = NM_DNS_MANAGER_GET_PRIVATE (self); + + if (data == priv->best_conf4) + priv->best_conf4 = NULL; + else if (data == priv->best_conf6) + priv->best_conf6 = NULL; + + g_signal_handlers_disconnect_by_func (data->config, ip_config_dns_priority_changed, self); +} + static gboolean nm_dns_manager_add_ip_config (NMDnsManager *self, const char *iface, @@ -1244,6 +1257,7 @@ nm_dns_manager_add_ip_config (NMDnsManager *self, && data->type == cfg_type) return FALSE; else { + forget_data (self, data); g_ptr_array_remove_index_fast (priv->configs, i); break; } @@ -1315,12 +1329,7 @@ nm_dns_manager_remove_ip_config (NMDnsManager *self, gpointer config) data = priv->configs->pdata[i]; if (data->config == config) { - if (config == priv->best_conf4) - priv->best_conf4 = NULL; - else if (config == priv->best_conf6) - priv->best_conf6 = NULL; - - g_signal_handlers_disconnect_by_func (config, ip_config_dns_priority_changed, self); + forget_data (self, data); g_ptr_array_remove_index (priv->configs, i); if (!priv->updates_queue && !update_dns (self, FALSE, &error)) { @@ -1667,9 +1676,7 @@ dispose (GObject *object) if (priv->configs) { for (i = 0; i < priv->configs->len; i++) { data = priv->configs->pdata[i]; - g_signal_handlers_disconnect_by_func (data->config, - ip_config_dns_priority_changed, - self); + forget_data (self, data); } g_ptr_array_free (priv->configs, TRUE); priv->configs = NULL;