summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2017-01-03 13:54:09 +0100
committerBeniamino Galvani <bgalvani@redhat.com>2017-01-10 14:26:32 +0100
commita9384452ed61ca3f1c6e1db175f499307da9c388 (patch)
treec776009d16ef60d6f5637de8e7543b8ae1873c19
parentbe1f04038dd3cd0a02eaf3e8ccbabe682d7bbfb0 (diff)
settings: fix assertion when changing connection managed state
When a ifcfg-rh connection becomes unamanaged it is removed from the connection list in NMSettings and marked as removed; it is however kept alive in the plugin and can become managed again later. To avoid failed assertions, the @removed flag of the NMSettingsConnection must be cleared if the connection is not being disposed.
-rw-r--r--src/settings/nm-settings-connection.c12
-rw-r--r--src/settings/nm-settings-connection.h2
-rw-r--r--src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-plugin.c4
-rw-r--r--src/settings/plugins/ifnet/nms-ifnet-plugin.c4
-rw-r--r--src/settings/plugins/keyfile/nms-keyfile-plugin.c2
5 files changed, 13 insertions, 11 deletions
diff --git a/src/settings/nm-settings-connection.c b/src/settings/nm-settings-connection.c
index 4441803a69..81dcb69898 100644
--- a/src/settings/nm-settings-connection.c
+++ b/src/settings/nm-settings-connection.c
@@ -761,7 +761,7 @@ do_delete (NMSettingsConnection *self,
/* Remove connection from seen-bssids database file */
remove_entry_from_db (self, "seen-bssids");
- nm_settings_connection_signal_remove (self);
+ nm_settings_connection_signal_remove (self, FALSE);
callback (self, NULL, user_data);
@@ -2096,13 +2096,15 @@ impl_settings_connection_clear_secrets (NMSettingsConnection *self,
/*****************************************************************************/
void
-nm_settings_connection_signal_remove (NMSettingsConnection *self)
+nm_settings_connection_signal_remove (NMSettingsConnection *self, gboolean allow_reuse)
{
NMSettingsConnectionPrivate *priv = NM_SETTINGS_CONNECTION_GET_PRIVATE (self);
- if (priv->removed)
- g_return_if_reached ();
- priv->removed = TRUE;
+ if (!allow_reuse) {
+ if (priv->removed)
+ g_return_if_reached ();
+ priv->removed = TRUE;
+ }
g_signal_emit_by_name (self, NM_SETTINGS_CONNECTION_REMOVED);
}
diff --git a/src/settings/nm-settings-connection.h b/src/settings/nm-settings-connection.h
index 737ba7010b..c5ddd8173e 100644
--- a/src/settings/nm-settings-connection.h
+++ b/src/settings/nm-settings-connection.h
@@ -176,7 +176,7 @@ void nm_settings_connection_recheck_visibility (NMSettingsConnection *self);
gboolean nm_settings_connection_check_permission (NMSettingsConnection *self,
const char *permission);
-void nm_settings_connection_signal_remove (NMSettingsConnection *self);
+void nm_settings_connection_signal_remove (NMSettingsConnection *self, gboolean allow_reuse);
gboolean nm_settings_connection_get_unsaved (NMSettingsConnection *self);
diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-plugin.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-plugin.c
index ada0493535..414f593b65 100644
--- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-plugin.c
+++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-plugin.c
@@ -161,7 +161,7 @@ remove_connection (SettingsPluginIfcfg *self, NMIfcfgConnection *connection)
g_object_ref (connection);
g_hash_table_remove (priv->connections, nm_connection_get_uuid (NM_CONNECTION (connection)));
if (!unmanaged && !unrecognized)
- nm_settings_connection_signal_remove (NM_SETTINGS_CONNECTION (connection));
+ nm_settings_connection_signal_remove (NM_SETTINGS_CONNECTION (connection), FALSE);
g_object_unref (connection);
/* Emit changes _after_ removing the connection */
@@ -330,7 +330,7 @@ update_connection (SettingsPluginIfcfg *self,
/* Unexport the connection by telling the settings service it's
* been removed.
*/
- nm_settings_connection_signal_remove (NM_SETTINGS_CONNECTION (connection_by_uuid));
+ nm_settings_connection_signal_remove (NM_SETTINGS_CONNECTION (connection_by_uuid), TRUE);
/* Remove the path so that claim_connection() doesn't complain later when
* interface gets managed and connection is re-added. */
nm_connection_set_path (NM_CONNECTION (connection_by_uuid), NULL);
diff --git a/src/settings/plugins/ifnet/nms-ifnet-plugin.c b/src/settings/plugins/ifnet/nms-ifnet-plugin.c
index 77f3b0bf52..5a6a8ce83b 100644
--- a/src/settings/plugins/ifnet/nms-ifnet-plugin.c
+++ b/src/settings/plugins/ifnet/nms-ifnet-plugin.c
@@ -258,7 +258,7 @@ reload_connections (NMSettingsPlugin *config)
NM_SETTING_COMPARE_FLAG_IGNORE_NOT_SAVED_SECRETS)) {
nm_log_info (LOGD_SETTINGS, "Auto refreshing %s", conn_name);
- nm_settings_connection_signal_remove (NM_SETTINGS_CONNECTION (old));
+ nm_settings_connection_signal_remove (NM_SETTINGS_CONNECTION (old), FALSE);
track_new_connection (self, new);
if (is_managed_plugin () && is_managed (conn_name))
g_signal_emit_by_name (self, NM_SETTINGS_PLUGIN_CONNECTION_ADDED, new);
@@ -300,7 +300,7 @@ reload_connections (NMSettingsPlugin *config)
*/
if ( nm_ifnet_connection_get_conn_name (NM_IFNET_CONNECTION (candidate))
&& !g_hash_table_lookup (new_connections, uuid)) {
- nm_settings_connection_signal_remove (candidate);
+ nm_settings_connection_signal_remove (candidate, FALSE);
g_hash_table_iter_remove (&iter);
}
}
diff --git a/src/settings/plugins/keyfile/nms-keyfile-plugin.c b/src/settings/plugins/keyfile/nms-keyfile-plugin.c
index 6f01149aeb..97306d6656 100644
--- a/src/settings/plugins/keyfile/nms-keyfile-plugin.c
+++ b/src/settings/plugins/keyfile/nms-keyfile-plugin.c
@@ -107,7 +107,7 @@ remove_connection (NMSKeyfilePlugin *self, NMSKeyfileConnection *connection)
g_signal_handlers_disconnect_by_func (connection, connection_removed_cb, self);
removed = g_hash_table_remove (NMS_KEYFILE_PLUGIN_GET_PRIVATE (self)->connections,
nm_connection_get_uuid (NM_CONNECTION (connection)));
- nm_settings_connection_signal_remove (NM_SETTINGS_CONNECTION (connection));
+ nm_settings_connection_signal_remove (NM_SETTINGS_CONNECTION (connection), FALSE);
g_object_unref (connection);
g_return_if_fail (removed);