[gnome-photos/gnome-3-22] base-item: Clean up the leftovers when _base_item_load_async fails



commit de16f594bc6605c4566f2e398ea033dd477da9b5
Author: Debarshi Ray <debarshir gnome org>
Date:   Sun Feb 26 13:05:30 2017 +0100

    base-item: Clean up the leftovers when _base_item_load_async fails
    
    This prevents the BaseItem from being left in an inconsistent state.
    For example, if the photos_base_item_load_async failure was due to a
    cancellation, then subsequent attempts to load the BaseItem might
    encounter a valid Pipeline and conclude that it is already loaded.
    When, in fact, the buffer source might not have a GeglBuffer due to
    the cancellation.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=777867

 src/photos-base-item.c |   25 +++++++++++++++++++++----
 1 files changed, 21 insertions(+), 4 deletions(-)
---
diff --git a/src/photos-base-item.c b/src/photos-base-item.c
index 5d8d27b..10b1f38 100644
--- a/src/photos-base-item.c
+++ b/src/photos-base-item.c
@@ -420,6 +420,22 @@ photos_base_item_check_effects_and_update_info (PhotosBaseItem *self)
 
 
 static void
+photos_base_item_clear_pixels (PhotosBaseItem *self)
+{
+  PhotosBaseItemPrivate *priv;
+
+  priv = photos_base_item_get_instance_private (self);
+
+  priv->buffer_source = NULL;
+
+  g_clear_object (&priv->edit_graph);
+  g_clear_object (&priv->pipeline);
+  g_clear_object (&priv->preview_source_buffer);
+  g_clear_object (&priv->processor);
+}
+
+
+static void
 photos_base_item_set_original_icon (PhotosBaseItem *self, GdkPixbuf *icon)
 {
   PhotosBaseItemPrivate *priv;
@@ -1385,6 +1401,7 @@ photos_base_item_load_process (GObject *source_object, GAsyncResult *res, gpoint
   photos_base_item_process_finish (self, res, &error);
   if (error != NULL)
     {
+      photos_base_item_clear_pixels (self);
       g_task_return_error (task, error);
       goto out;
     }
@@ -1418,6 +1435,7 @@ photos_base_item_load_load_buffer (GObject *source_object, GAsyncResult *res, gp
   buffer = photos_base_item_load_buffer_finish (self, res, &error);
   if (error != NULL)
     {
+      photos_base_item_clear_pixels (self);
       g_task_return_error (task, error);
       goto out;
     }
@@ -1455,6 +1473,7 @@ photos_base_item_load_pipeline (GObject *source_object, GAsyncResult *res, gpoin
   priv->pipeline = photos_pipeline_new_finish (res, &error);
   if (error != NULL)
     {
+      photos_base_item_clear_pixels (self);
       g_task_return_error (task, error);
       goto out;
     }
@@ -2356,14 +2375,12 @@ photos_base_item_dispose (GObject *object)
        g_clear_object (&priv->cancellable);
     }
 
+  photos_base_item_clear_pixels (self);
+
   g_clear_pointer (&priv->surface, (GDestroyNotify) cairo_surface_destroy);
   g_clear_object (&priv->default_app);
-  g_clear_object (&priv->preview_source_buffer);
-  g_clear_object (&priv->edit_graph);
-  g_clear_object (&priv->processor);
   g_clear_object (&priv->original_icon);
   g_clear_object (&priv->watcher);
-  g_clear_object (&priv->pipeline);
   g_clear_object (&priv->sel_cntrlr);
   g_clear_object (&priv->cursor);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]