3dd2676
From 61a6656bba99454d7e4ad3e9b8c4a4f7cabf68c3 Mon Sep 17 00:00:00 2001
3dd2676
From: Marek Kasik <mkasik@redhat.com>
3dd2676
Date: Wed, 11 Feb 2015 12:13:40 +0100
3dd2676
Subject: [PATCH] Check for failed rendering jobs
3dd2676
3dd2676
Check whether creating of thumbnails for sidebar, thumbnails for recent view
3dd2676
or rendering of document itself failed to avoid crashes.
3dd2676
3dd2676
https://bugzilla.gnome.org/show_bug.cgi?id=744049
3dd2676
---
3dd2676
 libdocument/ev-document.c     |  8 +++++---
3dd2676
 libview/ev-jobs.c             | 26 +++++++++++++++++++++++++-
3dd2676
 libview/ev-pixbuf-cache.c     |  6 ++++++
3dd2676
 shell/ev-recent-view.c        |  3 ++-
3dd2676
 shell/ev-sidebar-thumbnails.c |  5 +++++
3dd2676
 5 files changed, 43 insertions(+), 5 deletions(-)
3dd2676
3dd2676
diff --git a/libdocument/ev-document.c b/libdocument/ev-document.c
3dd2676
index 6c2f1b9..6af0ad7 100644
3dd2676
--- a/libdocument/ev-document.c
3dd2676
+++ b/libdocument/ev-document.c
3dd2676
@@ -724,11 +724,13 @@ _ev_document_get_thumbnail (EvDocument      *document,
3dd2676
 			    EvRenderContext *rc)
3dd2676
 {
3dd2676
 	cairo_surface_t *surface;
3dd2676
-	GdkPixbuf       *pixbuf;
3dd2676
+	GdkPixbuf       *pixbuf = NULL;
3dd2676
 
3dd2676
 	surface = ev_document_render (document, rc);
3dd2676
-	pixbuf = ev_document_misc_pixbuf_from_surface (surface);
3dd2676
-	cairo_surface_destroy (surface);
3dd2676
+	if (surface != NULL) {
3dd2676
+		pixbuf = ev_document_misc_pixbuf_from_surface (surface);
3dd2676
+		cairo_surface_destroy (surface);
3dd2676
+	}
3dd2676
 
3dd2676
 	return pixbuf;
3dd2676
 }
3dd2676
diff --git a/libview/ev-jobs.c b/libview/ev-jobs.c
3dd2676
index e118855..3bbe7b0 100644
3dd2676
--- a/libview/ev-jobs.c
3dd2676
+++ b/libview/ev-jobs.c
3dd2676
@@ -636,6 +636,21 @@ ev_job_render_run (EvJob *job)
3dd2676
 	g_object_unref (ev_page);
3dd2676
 
3dd2676
 	job_render->surface = ev_document_render (job->document, rc);
3dd2676
+
3dd2676
+	if (job_render->surface == NULL) {
3dd2676
+		ev_document_fc_mutex_unlock ();
3dd2676
+		ev_document_doc_mutex_unlock ();
3dd2676
+		g_object_unref (rc);
3dd2676
+
3dd2676
+		ev_job_failed (job,
3dd2676
+		               EV_DOCUMENT_ERROR,
3dd2676
+		               EV_DOCUMENT_ERROR_INVALID,
3dd2676
+		               _("Failed to render page %d"),
3dd2676
+		               job_render->page);
3dd2676
+
3dd2676
+		return FALSE;
3dd2676
+	}
3dd2676
+
3dd2676
 	/* If job was cancelled during the page rendering,
3dd2676
 	 * we return now, so that the thread is finished ASAP
3dd2676
 	 */
3dd2676
@@ -868,7 +883,16 @@ ev_job_thumbnail_run (EvJob *job)
3dd2676
                 g_object_unref (pixbuf);
3dd2676
         }
3dd2676
 
3dd2676
-	ev_job_succeeded (job);
3dd2676
+	if ((job_thumb->format == EV_JOB_THUMBNAIL_PIXBUF && pixbuf == NULL) ||
3dd2676
+	     job_thumb->thumbnail_surface == NULL) {
3dd2676
+		ev_job_failed (job,
3dd2676
+			       EV_DOCUMENT_ERROR,
3dd2676
+			       EV_DOCUMENT_ERROR_INVALID,
3dd2676
+			       _("Failed to create thumbnail for page %d"),
3dd2676
+			       job_thumb->page);
3dd2676
+	} else {
3dd2676
+		ev_job_succeeded (job);
3dd2676
+	}
3dd2676
 	
3dd2676
 	return FALSE;
3dd2676
 }
3dd2676
diff --git a/libview/ev-pixbuf-cache.c b/libview/ev-pixbuf-cache.c
3dd2676
index f308c9c..c7ae47a 100644
3dd2676
--- a/libview/ev-pixbuf-cache.c
3dd2676
+++ b/libview/ev-pixbuf-cache.c
3dd2676
@@ -337,6 +337,12 @@ job_finished_cb (EvJob         *job,
3dd2676
 
3dd2676
 	job_info = find_job_cache (pixbuf_cache, job_render->page);
3dd2676
 
3dd2676
+	if (ev_job_is_failed (job)) {
3dd2676
+		job_info->job = NULL;
3dd2676
+		g_object_unref (job);
3dd2676
+		return;
3dd2676
+	}
3dd2676
+
3dd2676
 	copy_job_to_job_info (job_render, job_info, pixbuf_cache);
3dd2676
 	g_signal_emit (pixbuf_cache, signals[JOB_FINISHED], 0, job_info->region);
3dd2676
 }
3dd2676
diff --git a/shell/ev-recent-view.c b/shell/ev-recent-view.c
3dd2676
index fb0004c..97f2f8e 100644
3dd2676
--- a/shell/ev-recent-view.c
3dd2676
+++ b/shell/ev-recent-view.c
3dd2676
@@ -350,7 +350,8 @@ static void
3dd2676
 thumbnail_job_completed_callback (EvJobThumbnail           *job,
3dd2676
                                   GetDocumentInfoAsyncData *data)
3dd2676
 {
3dd2676
-        if (g_cancellable_is_cancelled (data->cancellable)) {
3dd2676
+        if (g_cancellable_is_cancelled (data->cancellable) ||
3dd2676
+            ev_job_is_failed (EV_JOB (job))) {
3dd2676
                 get_document_info_async_data_free (data);
3dd2676
                 return;
3dd2676
         }
3dd2676
diff --git a/shell/ev-sidebar-thumbnails.c b/shell/ev-sidebar-thumbnails.c
3dd2676
index 49045f3..4186994 100644
3dd2676
--- a/shell/ev-sidebar-thumbnails.c
3dd2676
+++ b/shell/ev-sidebar-thumbnails.c
3dd2676
@@ -936,7 +936,12 @@ thumbnail_job_completed_callback (EvJobThumbnail      *job,
3dd2676
         cairo_surface_t            *surface;
3dd2676
 #ifdef HAVE_HIDPI_SUPPORT
3dd2676
         gint                        device_scale;
3dd2676
+#endif
3dd2676
+
3dd2676
+        if (ev_job_is_failed (EV_JOB (job)))
3dd2676
+          return;
3dd2676
 
3dd2676
+#ifdef HAVE_HIDPI_SUPPORT
3dd2676
         device_scale = gtk_widget_get_scale_factor (widget);
3dd2676
         cairo_surface_set_device_scale (job->thumbnail_surface, device_scale, device_scale);
3dd2676
 #endif
3dd2676
-- 
3dd2676
2.1.0
3dd2676