[gnome-documents] nav-bar: fix a crash when disposing while thumbnail in progress



commit 12ddbfcbbaf776649a6b82047e79f9e981a2f609
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Mon Apr 1 15:06:49 2013 -0400

    nav-bar: fix a crash when disposing while thumbnail in progress
    
    We didn't disconnect the thumbnail job signal and cancel it in
    dispose(), so when the widget was destroyed with thumbnail jobs in
    progress, we would access invalid memory from the job callback.

 src/lib/gd-nav-bar.c |   33 +++++++++++++++++++--------------
 1 files changed, 19 insertions(+), 14 deletions(-)
---
diff --git a/src/lib/gd-nav-bar.c b/src/lib/gd-nav-bar.c
index 9b945b5..ed7ac97 100644
--- a/src/lib/gd-nav-bar.c
+++ b/src/lib/gd-nav-bar.c
@@ -279,6 +279,18 @@ thumbnail_job_completed_cb (EvJobThumbnail *job,
 }
 
 static void
+preview_item_clear_thumbnail_job (GdNavBar *self,
+                                  PreviewItem *item)
+{
+        if (item->job != NULL) {
+                g_signal_handlers_disconnect_by_func (item->job, thumbnail_job_completed_cb, self);
+                ev_job_cancel (item->job);
+        }
+
+        g_clear_object (&item->job);
+}
+
+static void
 previews_clear_range (GdNavBar *self,
                       int       start_page,
                       int       end_page)
@@ -290,10 +302,8 @@ previews_clear_range (GdNavBar *self,
         for (i = start_page; i < end_page; i++) {
                 PreviewItem *item = &self->priv->previews[i];
 
-                if (item != NULL && item->job != NULL) {
-                        g_signal_handlers_disconnect_by_func (item->job, thumbnail_job_completed_cb, self);
-                        ev_job_cancel (item->job);
-                        g_clear_object (&item->job);
+                if (item != NULL) {
+                        preview_item_clear_thumbnail_job (self, item);
                 }
         }
 }
@@ -395,15 +405,6 @@ previews_create (GdNavBar *self)
 }
 
 static void
-preview_item_clear (PreviewItem *item)
-{
-        g_clear_object (&item->job);
-        g_clear_object (&item->pixbuf);
-        g_free (item->label);
-        item->label = NULL;
-}
-
-static void
 previews_clear (GdNavBar *self)
 {
         int i;
@@ -415,7 +416,11 @@ previews_clear (GdNavBar *self)
         for (i = 0; i < self->priv->n_pages; i++) {
                 PreviewItem *item = &self->priv->previews[i];
 
-                preview_item_clear (item);
+                preview_item_clear_thumbnail_job (self, item);
+
+                g_clear_object (&item->pixbuf);
+                g_free (item->label);
+                item->label = NULL;
         }
 
         g_free (self->priv->previews);


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