secret-file-collection: Improve etag tracking

This resets self->etag only after successful load of the contents, by
using a temporary variable and checking error of
g_file_replace_contents_finish, etc.

Signed-off-by: Daiki Ueno <dueno@src.gnome.org>
This commit is contained in:
Daiki Ueno 2023-10-19 17:22:13 +09:00
parent f83cd26858
commit 3c97587608

View File

@ -430,13 +430,16 @@ ensure_up_to_date (SecretFileCollection *self)
gsize length = 0; gsize length = 0;
gboolean success; gboolean success;
GError *error = NULL; GError *error = NULL;
gchar *etag = NULL;
self->file_last_modified = last_modified; self->file_last_modified = last_modified;
success = g_file_load_contents (self->file, NULL, &contents, &length, &etag, &error);
if (success) {
g_clear_pointer (&self->etag, g_free); g_clear_pointer (&self->etag, g_free);
self->etag = g_steal_pointer (&etag);
success = g_file_load_contents (self->file, NULL, &contents, &length, &self->etag, &error); } else if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) {
if (!success && g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) {
g_clear_error (&error); g_clear_error (&error);
success = init_empty_file (self, &error); success = init_empty_file (self, &error);
@ -464,12 +467,13 @@ on_load_contents (GObject *source_object,
gsize length; gsize length;
GError *error = NULL; GError *error = NULL;
gboolean ret; gboolean ret;
gchar *etag = NULL;
self->file_last_modified = get_file_last_modified (self); self->file_last_modified = get_file_last_modified (self);
ret = g_file_load_contents_finish (file, result, ret = g_file_load_contents_finish (file, result,
&contents, &length, &contents, &length,
&self->etag, &etag,
&error); &error);
if (!ret) { if (!ret) {
@ -488,6 +492,9 @@ on_load_contents (GObject *source_object,
return; return;
} }
g_clear_pointer (&self->etag, g_free);
self->etag = g_steal_pointer (&etag);
ret = load_contents (self, contents, length, &error); ret = load_contents (self, contents, length, &error);
if (ret) if (ret)
g_task_return_boolean (task, ret); g_task_return_boolean (task, ret);
@ -864,14 +871,17 @@ on_replace_contents (GObject *source_object,
GTask *task = G_TASK (user_data); GTask *task = G_TASK (user_data);
SecretFileCollection *self = g_task_get_source_object (task); SecretFileCollection *self = g_task_get_source_object (task);
GError *error = NULL; GError *error = NULL;
gchar *etag = NULL;
if (!g_file_replace_contents_finish (file, result, &self->etag, &error)) { if (!g_file_replace_contents_finish (file, result, &etag, &error)) {
g_task_return_error (task, error); g_task_return_error (task, error);
g_object_unref (task); g_object_unref (task);
return; return;
} }
self->file_last_modified = get_file_last_modified (self); self->file_last_modified = get_file_last_modified (self);
g_clear_pointer (&self->etag, g_free);
self->etag = g_steal_pointer (&etag);
g_task_return_boolean (task, TRUE); g_task_return_boolean (task, TRUE);
g_object_unref (task); g_object_unref (task);