aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>2018-03-10 15:21:18 +0900
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>2018-03-10 15:21:18 +0900
commit2110cdea8952745fc4ef4dafd2514419ad30526b (patch)
tree451a4b6f2b5ef6d2b80f38e9fcf688bd589b07d2
parentckpasswd: fix build on OpenBSD (typo) (diff)
downloadenlightenment-2110cdea8952745fc4ef4dafd2514419ad30526b.tar.gz
e systray/indicator protocol pixmap data fetch fix
this fixes several issues in the pixmap data fetching 1. it over-read the input buffer assuming ints count instead it has byte count for length 2. it would leak memory if you have multiple pixmaps and the largest was not the first found. 3. it always swapped pixel bytes instead of only on little endian. this should fix https://phab.enlightenment.org/T5910
-rw-r--r--src/modules/systray/e_mod_notifier_host_dbus.c34
1 files changed, 26 insertions, 8 deletions
diff --git a/src/modules/systray/e_mod_notifier_host_dbus.c b/src/modules/systray/e_mod_notifier_host_dbus.c
index a103c48a9..d00bc26c5 100644
--- a/src/modules/systray/e_mod_notifier_host_dbus.c
+++ b/src/modules/systray/e_mod_notifier_host_dbus.c
@@ -75,17 +75,35 @@ icon_pixmap_deserialize(Eldbus_Message_Iter *variant, uint32_t **data, int *w, i
int len;
//only take this img if it has a higher resolution
- if (tmpw > *w || tmph > *h)
+ if ((tmpw > *w) || (tmph > *h))
{
- *w = tmpw;
- *h = tmph;
if (eldbus_message_iter_fixed_array_get(imgdata, 'y', &img, &len))
{
- unsigned int pos;
-
- *data = malloc(len * sizeof(int));
- for (pos = 0; pos < (unsigned int)len; pos++)
- (*data)[pos] = eina_swap32(img[pos]);
+ unsigned int sz;
+
+ sz = tmpw * tmph;
+ if ((unsigned int)len == (sz * 4))
+ {
+ uint32_t *tmp;
+
+ tmp = malloc(tmpw * tmph * 4);
+ if (tmp)
+ {
+ uint32_t *s, *d, *e;
+
+ if (*data) free(*data);
+ *data = tmp;
+ *w = tmpw;
+ *h = tmph;
+ for (s = img, e = img + sz, d = *data;
+ s < e; s++, d++)
+#if (defined __BYTE_ORDER && __BYTE_ORDER == __LITTLE_ENDIAN) || (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
+ *d = eina_swap32(*s);
+#else
+ *d = *s;
+#endif
+ }
+ }
}
}
}