diff --git a/extensions/image-properties/nautilus-image-properties-model.c b/extensions/image-properties/nautilus-image-properties-model.c index 133f7aac795bdcc47124d8d6845a6ee46eddbead..5132ba759510ff3a4346f59fc4726b2f46b4c994 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,23 +259,6 @@ load_finished (NautilusImagesPropertiesModel *self) self->loader = NULL; } self->md_ready = FALSE; - g_clear_object (&self->md); -} - -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 @@ -284,6 +277,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)); @@ -332,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); } } @@ -379,6 +373,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;