Version in base suite: 1.20.3-1 Base version: atril_1.20.3-1 Target version: atril_1.20.3-1+deb10u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/a/atril/atril_1.20.3-1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/a/atril/atril_1.20.3-1+deb10u1.dsc changelog | 16 + patches/0001_prevent_no_doc_segfault.patch | 286 +++++++++++++++++++++++++++++ patches/0002_CVE-2019-1010006.patch | 44 ++++ patches/CVE-2019-11459.patch | 70 +++++++ patches/series | 3 5 files changed, 419 insertions(+) diff -Nru atril-1.20.3/debian/changelog atril-1.20.3/debian/changelog --- atril-1.20.3/debian/changelog 2018-12-22 21:24:46.000000000 +0000 +++ atril-1.20.3/debian/changelog 2019-12-16 09:33:35.000000000 +0000 @@ -1,3 +1,19 @@ +atril (1.20.3-1+deb10u1) buster; urgency=medium + + [ Martin Wimpress ] + * debian/patches: + + Add 0001_prevent_no_doc_segfault.patch. Prevent segfaults when no document + is loaded. + + Add 0002_CVE-2019-1010006.patch. Fix buffer overflow. (CVE-2019-1010006) + + [ Mike Gabriel ] + * debian/patches: + + Add CVE-2019-11459.patch. tiff: Handle failure from + TIFFReadRGBAImageOriented. (Closes: #927821). + + Rebase 0001_prevent_no_doc_segfault.patch. + + -- Mike Gabriel Mon, 16 Dec 2019 10:33:35 +0100 + atril (1.20.3-1) unstable; urgency=medium * New upstream release. diff -Nru atril-1.20.3/debian/patches/0001_prevent_no_doc_segfault.patch atril-1.20.3/debian/patches/0001_prevent_no_doc_segfault.patch --- atril-1.20.3/debian/patches/0001_prevent_no_doc_segfault.patch 1970-01-01 00:00:00.000000000 +0000 +++ atril-1.20.3/debian/patches/0001_prevent_no_doc_segfault.patch 2019-12-16 09:31:57.000000000 +0000 @@ -0,0 +1,286 @@ +From 807e54f51919de389c2824df6ccef41947c57911 Mon Sep 17 00:00:00 2001 +From: Reuben Green +Date: Sat, 3 Aug 2019 22:54:44 +0100 +Subject: [PATCH] prevent segfaults when no document loaded + +See the issue report for a description of the bug. The root cause is +dereferencing of NULL pointers, specifically the priv->document member of +EvWindow structures when no document is loaded. This commit adds checks +for a NULL value of priv->document at all the points in the file +shell/ev-window.c where this pointer was previously dereferenced without +being checked. + +Fixes 357 (https://github.com/mate-desktop/atril/issues/357) +--- + shell/ev-window.c | 63 ++++++++++++++++++++++++----------------------- + 1 file changed, 32 insertions(+), 31 deletions(-) + +--- a/shell/ev-window.c ++++ b/shell/ev-window.c +@@ -1448,7 +1448,7 @@ + /* Presentation */ + if (ev_metadata_get_boolean (window->priv->metadata, "presentation", &presentation)) { + if (presentation) { +- if (window->priv->document->iswebdocument == TRUE ) { ++ if (window->priv->document && window->priv->document->iswebdocument == TRUE ) { + return; + } + else { +@@ -1850,7 +1850,7 @@ + ev_window_handle_link (EvWindow *ev_window, + EvLinkDest *dest) + { +- if (ev_window->priv->document->iswebdocument == TRUE ) { ++ if (ev_window->priv->document && ev_window->priv->document->iswebdocument == TRUE ) { + return; + } + if (dest) { +@@ -4117,7 +4117,7 @@ + */ + if (ev_window->priv->chrome & EV_CHROME_FINDBAR) { + egg_find_bar_grab_focus(ev_window->priv->find_bar); +- } else if (ev_window->priv->document->iswebdocument == FALSE ) { ++ } else if (ev_window->priv->document && ev_window->priv->document->iswebdocument == FALSE ) { + ev_view_select_all (EV_VIEW (ev_window->priv->view)); + } + #if ENABLE_EPUB +@@ -4152,7 +4152,7 @@ + update_chrome_flag (ev_window, EV_CHROME_FINDBAR, TRUE); + update_chrome_visibility (ev_window); + gtk_widget_grab_focus (ev_window->priv->find_bar); +- if (ev_window->priv->document->iswebdocument == FALSE) { ++ if (ev_window->priv->document && ev_window->priv->document->iswebdocument == FALSE) { + ev_view_find_next (EV_VIEW (ev_window->priv->view)); + } + #if ENABLE_EPUB +@@ -4171,7 +4171,7 @@ + update_chrome_flag (ev_window, EV_CHROME_FINDBAR, TRUE); + update_chrome_visibility (ev_window); + gtk_widget_grab_focus (ev_window->priv->find_bar); +- if (ev_window->priv->document->iswebdocument == FALSE) { ++ if (ev_window->priv->document && ev_window->priv->document->iswebdocument == FALSE) { + ev_view_find_previous (EV_VIEW (ev_window->priv->view)); + } + #if ENABLE_EPUB +@@ -4186,7 +4186,7 @@ + { + g_return_if_fail (EV_IS_WINDOW (ev_window)); + #if ENABLE_EPUB +- if (ev_window->priv->document->iswebdocument) { ++ if (ev_window->priv->document && ev_window->priv->document->iswebdocument) { + ev_web_view_copy(EV_WEB_VIEW(ev_window->priv->webview)); + } else + #endif +@@ -4406,8 +4406,9 @@ + + if (EV_WINDOW_IS_PRESENTATION (window)) + return; ++ + +- if (window->priv->document->iswebdocument) { ++ if (window->priv->document && window->priv->document->iswebdocument) { + ev_window_warning_message(window,_("Presentation mode is not supported for ePub documents")); + return; + } +@@ -4795,7 +4796,7 @@ + + ev_document_model_set_sizing_mode (ev_window->priv->model, EV_SIZING_FREE); + #if ENABLE_EPUB +- if (ev_window->priv->document->iswebdocument) { ++ if (ev_window->priv->document && ev_window->priv->document->iswebdocument) { + ev_web_view_zoom_in(EV_WEB_VIEW(ev_window->priv->webview)); + } + else +@@ -4812,7 +4813,7 @@ + + ev_document_model_set_sizing_mode (ev_window->priv->model, EV_SIZING_FREE); + #if ENABLE_EPUB +- if ( ev_window->priv->document->iswebdocument) { ++ if (ev_window->priv->document && ev_window->priv->document->iswebdocument) { + ev_web_view_zoom_out(EV_WEB_VIEW(ev_window->priv->webview)); + } + else +@@ -4829,7 +4830,7 @@ + + ev_document_model_set_sizing_mode (ev_window->priv->model, EV_SIZING_FREE); + #if ENABLE_EPUB +- if ( ev_window->priv->document->iswebdocument) { ++ if (ev_window->priv->document && ev_window->priv->document->iswebdocument) { + ev_web_view_zoom_reset(EV_WEB_VIEW(ev_window->priv->webview)); + } + else +@@ -4844,7 +4845,7 @@ + { + g_return_if_fail (EV_IS_WINDOW (ev_window)); + #if ENABLE_EPUB +- if ( ev_window->priv->document->iswebdocument == TRUE ) { ++ if (ev_window->priv->document && ev_window->priv->document->iswebdocument == TRUE ) { + ev_web_view_previous_page(EV_WEB_VIEW(ev_window->priv->webview)); + } + else +@@ -4859,7 +4860,7 @@ + { + g_return_if_fail (EV_IS_WINDOW (ev_window)); + #if ENABLE_EPUB +- if ( ev_window->priv->document->iswebdocument == TRUE ) { ++ if (ev_window->priv->document && ev_window->priv->document->iswebdocument == TRUE ) { + ev_web_view_next_page(EV_WEB_VIEW(ev_window->priv->webview)); + } else + #endif +@@ -5440,8 +5441,8 @@ + gboolean show_internal = FALSE; + GtkAction *action; + +- if ( ev_window->priv->document->iswebdocument == TRUE ) return ; +- ++ if (ev_window->priv->document && ev_window->priv->document->iswebdocument == TRUE ) return ; ++ + if (ev_window->priv->link) + g_object_unref (ev_window->priv->link); + +@@ -5494,7 +5495,7 @@ + GtkAction *action; + gboolean show_image = FALSE; + +- if (ev_window->priv->document->iswebdocument == TRUE ) return ; ++ if (ev_window->priv->document && ev_window->priv->document->iswebdocument == TRUE ) return ; + if (ev_window->priv->image) + g_object_unref (ev_window->priv->image); + +@@ -5522,7 +5523,7 @@ + gboolean show_annot = FALSE; + gboolean can_remove_annots = FALSE; + +- if (ev_window->priv->document->iswebdocument == TRUE ) return ; ++ if (ev_window->priv->document && ev_window->priv->document->iswebdocument == TRUE ) return ; + if (ev_window->priv->annot) + g_object_unref (ev_window->priv->annot); + ev_window->priv->annot = (annot) ? g_object_ref (annot) : NULL; +@@ -5679,7 +5680,7 @@ + { + ev_window_update_actions (ev_window); + #if ENABLE_EPUB +- if (ev_window->priv->document->iswebdocument == TRUE ) { ++ if (ev_window->priv->document && ev_window->priv->document->iswebdocument == TRUE ) { + ev_web_view_find_changed(EV_WEB_VIEW(ev_window->priv->webview), + job->results,job->text, job->case_sensitive); + } +@@ -5716,7 +5717,7 @@ + EvWindow *ev_window) + { + #if ENABLE_EPUB +- if (ev_window->priv->document->iswebdocument == TRUE ) { ++ if (ev_window->priv->document && ev_window->priv->document->iswebdocument == TRUE ) { + ev_web_view_find_previous(EV_WEB_VIEW(ev_window->priv->webview)); + }else + #endif +@@ -5730,7 +5731,7 @@ + EvWindow *ev_window) + { + #if ENABLE_EPUB +- if (ev_window->priv->document->iswebdocument == TRUE ) { ++ if (ev_window->priv->document && ev_window->priv->document->iswebdocument == TRUE ) { + ev_web_view_find_next(EV_WEB_VIEW(ev_window->priv->webview)); + } else + #endif +@@ -5744,7 +5745,7 @@ + EvWindow *ev_window) + { + #if ENABLE_EPUB +- if (ev_window->priv->document->iswebdocument == TRUE ) { ++ if (ev_window->priv->document && ev_window->priv->document->iswebdocument == TRUE ) { + ev_web_view_find_cancel(EV_WEB_VIEW(ev_window->priv->webview)); + } + else +@@ -5800,7 +5801,7 @@ + { + /* Either the string or case sensitivity could have changed. */ + #if ENABLE_EPUB +- if (ev_window->priv->document->iswebdocument) { ++ if (ev_window->priv->document && ev_window->priv->document->iswebdocument) { + ev_web_view_find_search_changed(EV_WEB_VIEW (ev_window->priv->webview)); + } else + #endif +@@ -6570,7 +6571,7 @@ + static void + sidebar_links_link_activated_cb (EvSidebarLinks *sidebar_links, EvLink *link, EvWindow *window) + { +- if (window->priv->document->iswebdocument == FALSE ) { ++ if (window->priv->document && window->priv->document->iswebdocument == FALSE ) { + ev_view_handle_link (EV_VIEW (window->priv->view), link); + } + #if ENABLE_EPUB +@@ -6599,7 +6600,7 @@ + navigation_action_activate_link_cb (EvNavigationAction *action, EvLink *link, EvWindow *window) + { + #if ENABLE_EPUB +- if (window->priv->document->iswebdocument == TRUE ) { ++ if (window->priv->document && window->priv->document->iswebdocument == TRUE ) { + ev_web_view_handle_link(EV_WEB_VIEW(window->priv->webview),link); + gtk_widget_grab_focus (window->priv->webview); + return; +@@ -6613,7 +6614,7 @@ + sidebar_layers_visibility_changed (EvSidebarLayers *layers, + EvWindow *window) + { +- if (window->priv->document->iswebdocument == FALSE ) { ++ if (window->priv->document && window->priv->document->iswebdocument == FALSE ) { + ev_view_reload (EV_VIEW (window->priv->view)); + } + #if ENABLE_EPUB +@@ -6629,7 +6630,7 @@ + EvMapping *annot_mapping, + EvWindow *window) + { +- if (window->priv->document->iswebdocument == TRUE ) return; ++ if (window->priv->document && window->priv->document->iswebdocument == TRUE ) return; + ev_view_focus_annotation (EV_VIEW (window->priv->view), annot_mapping); + } + +@@ -6638,7 +6639,7 @@ + EvAnnotationType annot_type, + EvWindow *window) + { +- if (window->priv->document->iswebdocument == TRUE ) return; ++ if (window->priv->document && window->priv->document->iswebdocument == TRUE ) return; + ev_view_begin_add_annotation (EV_VIEW (window->priv->view), annot_type); + } + +@@ -6663,7 +6664,7 @@ + sidebar_annots_annot_add_cancelled (EvSidebarAnnotations *sidebar_annots, + EvWindow *window) + { +- if (window->priv->document->iswebdocument == TRUE ) return; ++ if (window->priv->document && window->priv->document->iswebdocument == TRUE ) return; + ev_view_cancel_add_annotation (EV_VIEW (window->priv->view)); + } + +@@ -7070,7 +7071,7 @@ + static void + ev_view_popup_cmd_open_link (GtkAction *action, EvWindow *window) + { +- if (window->priv->document->iswebdocument == TRUE ) return; ++ if (window->priv->document && window->priv->document->iswebdocument == TRUE ) return; + ev_view_handle_link (EV_VIEW (window->priv->view), window->priv->link); + } + +@@ -7095,7 +7096,7 @@ + ev_view_popup_cmd_copy_link_address (GtkAction *action, EvWindow *window) + { + EvLinkAction *ev_action; +- if (window->priv->document->iswebdocument == TRUE ) return; ++ if (window->priv->document && window->priv->document->iswebdocument == TRUE ) return; + ev_action = ev_link_get_action (window->priv->link); + if (!ev_action) + return; +@@ -7285,8 +7286,8 @@ + ev_view_popup_cmd_annot_properties (GtkAction *action, + EvWindow *window) + { +- if (window->priv->document->iswebdocument == TRUE ) return; +- ++ if (window->priv->document && window->priv->document->iswebdocument == TRUE ) return; ++ + const gchar *author; + GdkRGBA rgba; + gdouble opacity; diff -Nru atril-1.20.3/debian/patches/0002_CVE-2019-1010006.patch atril-1.20.3/debian/patches/0002_CVE-2019-1010006.patch --- atril-1.20.3/debian/patches/0002_CVE-2019-1010006.patch 1970-01-01 00:00:00.000000000 +0000 +++ atril-1.20.3/debian/patches/0002_CVE-2019-1010006.patch 2019-12-16 09:29:52.000000000 +0000 @@ -0,0 +1,44 @@ +diff --git a/backend/tiff/tiff-document.c b/backend/tiff/tiff-document.c +index 0aa31cb6..94adc400 100644 +--- a/backend/tiff/tiff-document.c ++++ b/backend/tiff/tiff-document.c +@@ -268,13 +268,14 @@ tiff_document_render (EvDocument *document, + return NULL; + } + +- bytes = height * rowstride; +- if (bytes / rowstride != height) { ++ if (height >= INT_MAX / rowstride) { + g_warning("Overflow while rendering document."); + /* overflow */ + return NULL; + } + ++ bytes = height * rowstride; ++ + pixels = g_try_malloc (bytes); + if (!pixels) { + g_warning("Failed to allocate memory for rendering."); +@@ -356,15 +357,17 @@ tiff_document_render_pixbuf (EvDocument *document, + if (width <= 0 || height <= 0) + return NULL; + +- rowstride = width * 4; +- if (rowstride / 4 != width) ++ if (width >= INT_MAX / 4) + /* overflow */ + return NULL; + +- bytes = height * rowstride; +- if (bytes / rowstride != height) ++ rowstride = width * 4; ++ ++ if (height >= INT_MAX / rowstride) + /* overflow */ +- return NULL; ++ return NULL; ++ ++ bytes = height * rowstride; + + pixels = g_try_malloc (bytes); + if (!pixels) diff -Nru atril-1.20.3/debian/patches/CVE-2019-11459.patch atril-1.20.3/debian/patches/CVE-2019-11459.patch --- atril-1.20.3/debian/patches/CVE-2019-11459.patch 1970-01-01 00:00:00.000000000 +0000 +++ atril-1.20.3/debian/patches/CVE-2019-11459.patch 2019-12-16 09:30:41.000000000 +0000 @@ -0,0 +1,70 @@ +From 5ecffe6a75542fc4d82264c9b263fee5d25a84b1 Mon Sep 17 00:00:00 2001 +From: Victor Kareh +Date: Sun, 11 Aug 2019 05:20:09 +0300 +Subject: [PATCH] tiff: Handle failure from TIFFReadRGBAImageOriented + +The TIFFReadRGBAImageOriented function returns zero if it was unable to +read the image. Return NULL in this case instead of displaying +uninitialized memory. + +This addresses CVE-2019-11459 + +upstream commit: +https://gitlab.gnome.org/GNOME/evince/commit/234f034a4 +--- + backend/tiff/tiff-document.c | 26 +++++++++++++++++--------- + 1 file changed, 17 insertions(+), 9 deletions(-) + +--- a/backend/tiff/tiff-document.c ++++ b/backend/tiff/tiff-document.c +@@ -281,6 +281,15 @@ + g_warning("Failed to allocate memory for rendering."); + return NULL; + } ++ ++ if (!TIFFReadRGBAImageOriented (tiff_document->tiff, ++ width, height, ++ (uint32 *)pixels, ++ orientation, 0)) { ++ g_warning ("Failed to read TIFF image."); ++ g_free (pixels); ++ return NULL; ++ } + + surface = cairo_image_surface_create_for_data (pixels, + CAIRO_FORMAT_RGB24, +@@ -288,11 +297,6 @@ + rowstride); + cairo_surface_set_user_data (surface, &key, + pixels, (cairo_destroy_func_t)g_free); +- +- TIFFReadRGBAImageOriented (tiff_document->tiff, +- width, height, +- (uint32 *)pixels, +- orientation, 0); + pop_handlers (); + + /* Convert the format returned by libtiff to +@@ -372,14 +376,18 @@ + pixels = g_try_malloc (bytes); + if (!pixels) + return NULL; ++ ++ if (!TIFFReadRGBAImageOriented (tiff_document->tiff, ++ width, height, ++ (uint32 *)pixels, ++ ORIENTATION_TOPLEFT, 0)) { ++ g_free (pixels); ++ return NULL; ++ } + + pixbuf = gdk_pixbuf_new_from_data (pixels, GDK_COLORSPACE_RGB, TRUE, 8, + width, height, rowstride, + (GdkPixbufDestroyNotify) g_free, NULL); +- TIFFReadRGBAImageOriented (tiff_document->tiff, +- width, height, +- (uint32 *)pixels, +- ORIENTATION_TOPLEFT, 0); + pop_handlers (); + + scaled_pixbuf = gdk_pixbuf_scale_simple (pixbuf, diff -Nru atril-1.20.3/debian/patches/series atril-1.20.3/debian/patches/series --- atril-1.20.3/debian/patches/series 1970-01-01 00:00:00.000000000 +0000 +++ atril-1.20.3/debian/patches/series 2019-12-16 09:31:03.000000000 +0000 @@ -0,0 +1,3 @@ +0001_prevent_no_doc_segfault.patch +0002_CVE-2019-1010006.patch +CVE-2019-11459.patch