diff options
author | Christian Persch <chpe@gnome.org> | 2008-10-20 16:55:00 +0000 |
---|---|---|
committer | Christian Persch <chpe@src.gnome.org> | 2008-10-20 16:55:00 +0000 |
commit | 4ba6262be9af01d42851db242ef83ece7d8ddb19 (patch) | |
tree | 324b62f0856db3f1a98a95bb2aaad3991bc89c12 /gtk | |
parent | 093d425393c5a58cb2161944f612779bbdb5e260 (diff) | |
download | gtk+-4ba6262be9af01d42851db242ef83ece7d8ddb19.tar.gz |
Bug 557059 – crash when compositing emblems with icon
2008-10-20 Christian Persch <chpe@gnome.org>
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
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/gtkicontheme.c | 23 |
1 files changed, 19 insertions, 4 deletions
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 |