diff options
author | Thomas Haller <thaller@redhat.com> | 2023-06-16 16:23:15 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2023-06-29 14:05:27 +0200 |
commit | cfe2cede12e56c791645807f3124a27a01b92aa9 (patch) | |
tree | 187ed52ca0b2a07684ff83505c5b82f1e9daf4f1 | |
parent | 3d2622c358643243391c4a56f782ea07fa7b0468 (diff) |
core/settings: fix "force_rename" for writing connection to disk
"force_rename" parameter was not used previously, but it also was broken.
Fix it. We need to create a new NMSettingsStorage instance when the filename
changes, as the storage's filename is immutable.
-rw-r--r-- | src/core/settings/nm-settings.c | 16 | ||||
-rw-r--r-- | src/core/settings/plugins/keyfile/nms-keyfile-plugin.c | 39 |
2 files changed, 43 insertions, 12 deletions
diff --git a/src/core/settings/nm-settings.c b/src/core/settings/nm-settings.c index e891e58dfc..5fc2db8cc3 100644 --- a/src/core/settings/nm-settings.c +++ b/src/core/settings/nm-settings.c @@ -2017,9 +2017,10 @@ nm_settings_update_connection(NMSettings *self, gs_unref_object NMConnection *new_connection_cloned = NULL; gs_unref_object NMConnection *new_connection = NULL; NMConnection *new_connection_real; - gs_unref_object NMSettingsStorage *cur_storage = NULL; - gs_unref_object NMSettingsStorage *new_storage = NULL; - NMSettingsStorage *drop_storage = NULL; + gs_unref_object NMSettingsStorage *cur_storage = NULL; + gs_unref_object NMSettingsStorage *new_storage = NULL; + NMSettingsStorage *drop_storage = NULL; + NMSettingsStorage *prev_update_storage = NULL; SettConnEntry *sett_conn_entry; gboolean cur_in_memory; gboolean new_in_memory; @@ -2324,6 +2325,9 @@ nm_settings_update_connection(NMSettings *self, nm_assert_not_reached(); new_connection_real = new_connection; } + + if (update_storage && new_storage != update_storage) + prev_update_storage = update_storage; } } @@ -2332,6 +2336,12 @@ nm_settings_update_connection(NMSettings *self, _connection_changed_track(self, new_storage, new_connection_real, TRUE); + if (prev_update_storage) { + /* The storage was swapped by the update call. The old one needs + * to be dropped, which we do by setting the connection to NULL. */ + _connection_changed_track(self, prev_update_storage, NULL, FALSE); + } + if (drop_storage && drop_storage != new_storage) { gs_free_error GError *local = NULL; diff --git a/src/core/settings/plugins/keyfile/nms-keyfile-plugin.c b/src/core/settings/plugins/keyfile/nms-keyfile-plugin.c index 1d48ce19ae..fb0c6dc6be 100644 --- a/src/core/settings/plugins/keyfile/nms-keyfile-plugin.c +++ b/src/core/settings/plugins/keyfile/nms-keyfile-plugin.c @@ -910,8 +910,6 @@ nms_keyfile_plugin_update_connection(NMSKeyfilePlugin *self, previous_filename = nms_keyfile_storage_get_filename(storage); uuid = nms_keyfile_storage_get_uuid(storage); - /* FIXME: force_rename is unused so far. */ - if (!nms_keyfile_writer_connection( connection, is_nm_generated, @@ -924,7 +922,7 @@ nms_keyfile_plugin_update_connection(NMSKeyfilePlugin *self, _get_plugin_dir(priv), previous_filename, FALSE, - FALSE, + force_rename, nm_sett_util_allow_filename_cb, NM_SETT_UTIL_ALLOW_FILENAME_DATA(&priv->storages, previous_filename), &full_filename, @@ -940,7 +938,8 @@ nms_keyfile_plugin_update_connection(NMSKeyfilePlugin *self, return FALSE; } - nm_assert(full_filename && nm_streq(full_filename, previous_filename)); + nm_assert(full_filename); + nm_assert(force_rename || nm_streq(full_filename, previous_filename)); if (!reread || reread_same) nm_g_object_ref_set(&reread, connection); @@ -959,11 +958,33 @@ nms_keyfile_plugin_update_connection(NMSKeyfilePlugin *self, "\")", "")); - storage->u.conn_data.is_nm_generated = is_nm_generated; - storage->u.conn_data.is_volatile = is_volatile; - storage->u.conn_data.is_external = is_external; - storage->u.conn_data.stat_mtime = *nm_sett_util_stat_mtime(full_filename, FALSE, &mtime); - storage->u.conn_data.shadowed_owned = shadowed_owned; + nm_sett_util_stat_mtime(full_filename, FALSE, &mtime); + + if (nm_streq(full_filename, previous_filename)) { + storage->u.conn_data.is_nm_generated = is_nm_generated; + storage->u.conn_data.is_volatile = is_volatile; + storage->u.conn_data.is_external = is_external; + storage->u.conn_data.stat_mtime = mtime; + storage->u.conn_data.shadowed_owned = shadowed_owned; + } else { + NMSKeyfileStorage *storage_new; + + /* The filename changed. We cannot modify the filename of an NMSettingsStorage. + * We need to create a new one. */ + storage_new = + nms_keyfile_storage_new_connection(NMS_KEYFILE_PLUGIN(storage->parent._plugin), + g_object_ref(reread), + full_filename, + storage->storage_type, + is_nm_generated, + is_volatile, + is_external, + storage->u.conn_data.shadowed_storage, + shadowed_owned, + &mtime); + nm_sett_util_storages_add_take(&priv->storages, storage_new); + storage = storage_new; + } *out_storage = g_object_ref(NM_SETTINGS_STORAGE(storage)); *out_connection = g_steal_pointer(&reread); |