From a9384452ed61ca3f1c6e1db175f499307da9c388 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Tue, 3 Jan 2017 13:54:09 +0100 Subject: 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. --- src/settings/nm-settings-connection.c | 12 +++++++----- src/settings/nm-settings-connection.h | 2 +- src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-plugin.c | 4 ++-- src/settings/plugins/ifnet/nms-ifnet-plugin.c | 4 ++-- src/settings/plugins/keyfile/nms-keyfile-plugin.c | 2 +- 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); -- cgit v1.2.3