From 82776df9d6b5e2003a4e9f41c65c01efc5d5a350 Mon Sep 17 00:00:00 2001 From: o9000 Date: Thu, 27 Apr 2017 09:04:16 +0200 Subject: [PATCH] Fix crash when _NET_WM_ICON is set but empty --- src/taskbar/task.c | 34 +++++++++++++++++----------------- src/util/window.c | 3 +++ 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/taskbar/task.c b/src/taskbar/task.c index f2fa358..c0790e1 100644 --- a/src/taskbar/task.c +++ b/src/taskbar/task.c @@ -276,25 +276,25 @@ void task_update_icon(Task *task) Imlib_Image img = NULL; if (!img) { - int i; - gulong *data = server_get_property(task->win, server.atom._NET_WM_ICON, XA_CARDINAL, &i); - if (data) { + int len; + gulong *data = server_get_property(task->win, server.atom._NET_WM_ICON, XA_CARDINAL, &len); + if (data && len > 0) { // get ARGB icon int w, h; - gulong *tmp_data; - - tmp_data = get_best_icon(data, get_icon_count(data, i), i, &w, &h, panel->g_task.icon_size1); - DATA32 icon_data[w * h]; - for (int j = 0; j < w * h; ++j) - icon_data[j] = tmp_data[j]; - img = imlib_create_image_using_copied_data(w, h, icon_data); - if (0 && img) - fprintf(stderr, - "%s: Got %dx%d icon via _NET_WM_ICON for %s\n", - __FUNCTION__, - w, - h, - task->title ? task->title : "task"); + gulong *tmp_data = get_best_icon(data, get_icon_count(data, len), len, &w, &h, panel->g_task.icon_size1); + if (tmp_data) { + DATA32 icon_data[w * h]; + for (int j = 0; j < w * h; ++j) + icon_data[j] = tmp_data[j]; + img = imlib_create_image_using_copied_data(w, h, icon_data); + if (0 && img) + fprintf(stderr, + "%s: Got %dx%d icon via _NET_WM_ICON for %s\n", + __FUNCTION__, + w, + h, + task->title ? task->title : "task"); + } XFree(data); } } diff --git a/src/util/window.c b/src/util/window.c index 07fb77a..9f9175f 100644 --- a/src/util/window.c +++ b/src/util/window.c @@ -277,6 +277,9 @@ int get_icon_count(gulong *data, int num) gulong *get_best_icon(gulong *data, int icon_count, int num, int *iw, int *ih, int best_icon_size) { + if (icon_count < 1 || num < 1) + return NULL; + int width[icon_count], height[icon_count], pos, i, w, h; gulong *icon_data[icon_count];