Currently NM first updates in-memory connection and then requests plugin to store definition. If plugin failed to store for whatever reason we are left with new memory state and stale permanent copy. What makes is worse, nm-connection-editor does not indicate any error in this case, so user is unaware that all settings are lost after NM is restarted.
Save connection copy before calling plugin and revert to it if plugin indicated failure. Signed-off-by: Andrey Borzenkov <arvidj...@gmail.com> --- src/system-settings/nm-sysconfig-connection.c | 15 +++++++++++++-- 1 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/system-settings/nm-sysconfig-connection.c b/src/system-settings/nm-sysconfig-connection.c index 73906d2..5159407 100644 --- a/src/system-settings/nm-sysconfig-connection.c +++ b/src/system-settings/nm-sysconfig-connection.c @@ -245,6 +245,9 @@ typedef struct { /* Update */ NMConnection *connection; + /* Rollback */ + NMConnection *old_connection; + /* Secrets */ char *setting_name; char **hints; @@ -270,6 +273,7 @@ polkit_call_new (NMSysconfigConnection *self, call->context = context; call->cancellable = g_cancellable_new (); call->connection = connection; + call->old_connection = NULL; call->setting_name = g_strdup (setting_name); if (hints) call->hints = g_strdupv ((char **) hints); @@ -287,6 +291,8 @@ polkit_call_free (PolkitCall *call) { if (call->connection) g_object_unref (call->connection); + if (call->old_connection) + g_object_unref (call->old_connection); g_free (call->setting_name); if (call->hints) g_strfreev (call->hints); @@ -303,9 +309,11 @@ con_update_cb (NMSettingsConnectionInterface *connection, { PolkitCall *call = user_data; - if (error) + if (error) { + + nm_sysconfig_connection_update (call->self, call->old_connection, FALSE, NULL); dbus_g_method_return_error (call->context, error); - else + } else dbus_g_method_return (call->context); polkit_call_free (call); @@ -357,6 +365,9 @@ pk_update_cb (GObject *object, GAsyncResult *result, gpointer user_data) goto out; } + /* Save old connection so we can restore it later */ + call->old_connection = nm_connection_duplicate (NM_CONNECTION (self)); + /* Update our settings internally so the update() call will save the new * ones. We don't let nm_sysconfig_connection_update() handle the update * signal since we need our own callback after the update is done. -- tg: (f6f8ef2..) u/conn-update (depends on: upstream/master) _______________________________________________ networkmanager-list mailing list networkmanager-list@gnome.org http://mail.gnome.org/mailman/listinfo/networkmanager-list