From 4ba6262be9af01d42851db242ef83ece7d8ddb19 Mon Sep 17 00:00:00 2001 From: Christian Persch Date: Mon, 20 Oct 2008 16:55:00 +0000 Subject: [PATCH] =?UTF-8?q?Bug=20557059=20=E2=80=93=20crash=20when=20compo?= =?UTF-8?q?siting=20emblems=20with=20icon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2008-10-20 Christian Persch Bug 557059 – crash when compositing emblems with icon * gtk/gtkicontheme.c: (apply_emblems): Copy the pixbuf before using it with gtk_pixbuf_composite, in case its pixdata is read-only (mmaped from icon cache or builtins). svn path=/trunk/; revision=21690 --- ChangeLog | 8 ++++++++ gtk/gtkicontheme.c | 23 +++++++++++++++++++---- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index f3bef2cc99..69982b1991 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-10-20 Christian Persch + + Bug 557059 – crash when compositing emblems with icon + + * gtk/gtkicontheme.c: (apply_emblems): Copy the pixbuf before using it + with gtk_pixbuf_composite, in case its pixdata is read-only (mmaped + from icon cache or builtins). + 2008-10-20 Murray Cumming * gtk/gtkiconview.c: gtk_icon_view_set_tooltip_row(), diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c index 04ef756ba4..5fc1b3b20b 100644 --- a/gtk/gtkicontheme.c +++ b/gtk/gtkicontheme.c @@ -2776,13 +2776,15 @@ static gboolean icon_info_ensure_scale_and_pixbuf (GtkIconInfo*, gboolean); static void apply_emblems (GtkIconInfo *info) { - GdkPixbuf *icon; + GdkPixbuf *icon = NULL; gint w, h, pos; GSList *l; - icon = info->pixbuf; - w = gdk_pixbuf_get_width (icon); - h = gdk_pixbuf_get_height (icon); + if (info->emblem_infos == NULL) + return; + + w = gdk_pixbuf_get_width (info->pixbuf); + h = gdk_pixbuf_get_height (info->pixbuf); for (l = info->emblem_infos, pos = 0; l; l = l->next, pos++) { @@ -2826,10 +2828,23 @@ apply_emblems (GtkIconInfo *info) break; } + if (icon == NULL) + { + icon = gdk_pixbuf_copy (info->pixbuf); + if (icon == NULL) + break; + } + gdk_pixbuf_composite (emblem, icon, x, y, ew, eh, x, y, scale, scale, GDK_INTERP_BILINEAR, 255); } } + + if (icon) + { + g_object_unref (info->pixbuf); + info->pixbuf = icon; + } } /* This function contains the complicated logic for deciding