Blame SOURCES/evince-3.14.2-printing-check-for-failed-rendering-jobs.patch

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