From 7b13e541fd795967d70ca14643c773639998ead2 Mon Sep 17 00:00:00 2001 From: Khalid Abu Shawarib Date: Mon, 6 Nov 2023 17:58:21 +0300 Subject: [PATCH 1/3] extensions/image-properties: Handle cancellation properly Calling refresh_extension_model_pages() might cancel a pending IO operation and free the ImagesPropertiesModel. Bailout after being cancelled instead of using a freed data. --- .../nautilus-image-properties-model.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/extensions/image-properties/nautilus-image-properties-model.c b/extensions/image-properties/nautilus-image-properties-model.c index 133f7aac79..0d348a80d2 100644 --- a/extensions/image-properties/nautilus-image-properties-model.c +++ b/extensions/image-properties/nautilus-image-properties-model.c @@ -284,6 +284,12 @@ file_read_callback (GObject *object, count_read = g_input_stream_read_finish (stream, res, &error); done_reading = FALSE; + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + { + /* The operation was cancelled and the model was already freed, bailout. */ + return; + } + if (count_read > 0) { g_assert (count_read <= sizeof (self->buffer)); @@ -379,6 +385,13 @@ file_open_callback (GObject *object, file = G_FILE (object); uri = g_file_get_uri (file); stream = g_file_read_finish (file, res, &error); + + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + { + /* The operation was cancelled and the model was already freed, bailout. */ + return; + } + if (stream != NULL) { g_autofree char *mime_type = NULL; -- GitLab From 33667b89946f9d301234ad3dc0a66e34f9a077dd Mon Sep 17 00:00:00 2001 From: Khalid Abu Shawarib Date: Mon, 6 Nov 2023 17:58:21 +0300 Subject: [PATCH 2/3] extensions/image-properties: Cleanup cancellation properly Free the resources left over in the case of a cancellation which was handeled in the previous commit. --- .../nautilus-image-properties-model.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/extensions/image-properties/nautilus-image-properties-model.c b/extensions/image-properties/nautilus-image-properties-model.c index 0d348a80d2..17d588a7ff 100644 --- a/extensions/image-properties/nautilus-image-properties-model.c +++ b/extensions/image-properties/nautilus-image-properties-model.c @@ -53,6 +53,16 @@ nautilus_images_properties_model_free (NautilusImagesPropertiesModel *self) g_cancellable_cancel (self->cancellable); g_clear_object (&self->cancellable); } + + if (self->loader != NULL) + { + gdk_pixbuf_loader_close (self->loader, NULL); + g_clear_object (&self->loader); + } + + g_clear_object (&self->md); + g_clear_object (&self->group_model); + g_free (self); } @@ -249,7 +259,6 @@ load_finished (NautilusImagesPropertiesModel *self) self->loader = NULL; } self->md_ready = FALSE; - g_clear_object (&self->md); } static void -- GitLab From e253a639d986c12a2b3a7e9dec2594106232264d Mon Sep 17 00:00:00 2001 From: Khalid Abu Shawarib Date: Mon, 6 Nov 2023 17:58:21 +0300 Subject: [PATCH 3/3] extensions/image-properties: Remove unnecessary code --- .../nautilus-image-properties-model.c | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/extensions/image-properties/nautilus-image-properties-model.c b/extensions/image-properties/nautilus-image-properties-model.c index 17d588a7ff..5132ba7595 100644 --- a/extensions/image-properties/nautilus-image-properties-model.c +++ b/extensions/image-properties/nautilus-image-properties-model.c @@ -261,22 +261,6 @@ load_finished (NautilusImagesPropertiesModel *self) self->md_ready = FALSE; } -static void -file_close_callback (GObject *object, - GAsyncResult *res, - gpointer data) -{ - NautilusImagesPropertiesModel *self; - GInputStream *stream; - - self = data; - stream = G_INPUT_STREAM (object); - - g_input_stream_close_finish (stream, res, NULL); - - g_clear_object (&self->cancellable); -} - static void file_read_callback (GObject *object, GAsyncResult *res, @@ -347,11 +331,6 @@ file_read_callback (GObject *object, if (done_reading) { load_finished (self); - g_input_stream_close_async (stream, - G_PRIORITY_DEFAULT, - self->cancellable, - file_close_callback, - self); } } -- GitLab